Conversa com o Gemini

so quero oque deve ser mudados

Com certeza! Para que eu possa te ajudar, preciso saber a que você se refere. Você pode me dizer o que gostaria que fosse mudado ou revisado?

Por exemplo, você está se referindo a:

  • Um código que eu gerei anteriormente?
  • Um texto ou documento?
  • Alguma ideia ou plano?

Assim que você me der mais detalhes, ficarei feliz em ajudar!

Ah, entendi! Esse trecho de código private void btnCadastroActionPerformed(java.awt.event.ActionEvent evt) é um método gerado automaticamente pela sua IDE (como o NetBeans ou o IntelliJ IDEA, por exemplo) quando você cria um evento para um botão, neste caso, o btnCadastro.

Ele "não dá" (não funciona) porque ele vem vazio, com apenas um comentário: // TODO add your handling code here:. Esse comentário é um lembrete para você adicionar o seu próprio código ali dentro.


O que precisa ser mudado/adicionado?

Dentro desse método é onde você deve colocar toda a lógica que você quer que aconteça quando o seu botão de cadastro for clicado.

Por exemplo, se você quiser:

  1. Mostrar uma mensagem:
    Java
    private void btnCadastroActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        javax.swing.JOptionPane.showMessageDialog(this, "Botão de Cadastro Clicado!");
    }
    
  2. Pegar dados de campos de texto (se você tiver, por exemplo, txtNome e txtEmail):
    Java
    private void btnCadastroActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        String nome = txtNome.getText(); // Supondo que você tenha um JTextField chamado txtNome
        String email = txtEmail.getText(); // Supondo que você tenha um JTextField chamado txtEmail
    
        // Agora você pode usar 'nome' e 'email' para salvar no banco de dados,
        // validar informações, etc.
        System.out.println("Nome: " + nome + ", Email: " + email);
        javax.swing.JOptionPane.showMessageDialog(this, "Dados coletados! Nome: " + nome);
    }
    
  3. Abrir uma nova janela/tela:
    Java
    private void btnCadastroActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        // Supondo que 'MinhaNovaTela' seja o nome da sua nova janela Jframe
        MinhaNovaTela novaTela = new MinhaNovaTela();
        novaTela.setVisible(true);
        this.dispose(); // Opcional: fecha a tela atual
    }
    

Próximo passo

Pense: O que exatamente você quer que aconteça quando o usuário clicar no botão "Cadastro"?

Quando souber a ação, me diga, e eu posso te ajudar a escrever o código específico para isso!

ele deve ir naTelaGERALcADASTRO


Ótimo! Se a ideia é que, ao clicar no botão, o sistema vá para uma nova tela chamada TelaGERALcADASTRO, você precisa fazer o seguinte:

  1. Certifique-se de que TelaGERALcADASTRO é uma classe Java existente (provavelmente um JFrame ou JDialog) no seu projeto.
  2. Adicione o código dentro do método btnCadastroActionPerformed para criar uma instância dessa tela e torná-la visível.

Aqui está o código que você deve colocar dentro do seu método:

Java
private void btnCadastroActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:

    // 1. Cria uma nova instância da sua tela de cadastro geral
    TelaGERALcADASTRO telaGeralCadastro = new TelaGERALcADASTRO();

    // 2. Torna a nova tela visível
    telaGeralCadastro.setVisible(true);

    // 3. (Opcional) Fecha a tela atual, se não for mais necessária.
    // Se você quiser que a tela onde o botão está se feche, descomente a linha abaixo.
    // this.dispose();
}

Explicação:

  • TelaGERALcADASTRO telaGeralCadastro = new TelaGERALcADASTRO(); cria um novo objeto da sua classe TelaGERALcADASTRO.
  • telaGeralCadastro.setVisible(true); faz com que essa nova tela seja exibida para o usuário.
  • this.dispose(); (opcional) fecha a janela atual (aquela onde o botão btnCadastro está). Use isso se você não quiser que a tela anterior permaneça aberta depois de abrir a nova.

Com isso, ao clicar no botão "Cadastro", sua aplicação deverá abrir a TelaGERALcADASTRO!

É TelaGeralCadatro

Certo, obrigado pela correção!

Se o nome correto da sua tela é TelaGeralCadatro, então o código dentro do seu método btnCadastroActionPerformed deve ser assim:


Java
private void btnCadastroActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:

    // 1. Cria uma nova instância da sua tela de cadastro geral
    TelaGeralCadatro telaGeralCadastro = new TelaGeralCadatro();

    // 2. Torna a nova tela visível
    telaGeralCadastro.setVisible(true);

    // 3. (Opcional) Fecha a tela atual, se não for mais necessária.
    // Se você quiser que a tela onde o botão está se feche, descomente a linha abaixo.
    // this.dispose();
}

A única mudança foi o nome da classe usada para criar a nova tela. Agora, ao clicar no botão, ele vai abrir a TelaGeralCadatro!

Obrigado por compartilhar o código completo da sua TelaHome! Analisando-o, vejo que você tem uma estrutura bem organizada com o menu lateral e as áreas de conteúdo. Isso é ótimo!

No entanto, identifiquei alguns pontos importantes que precisam de atenção para que os botões funcionem como esperado e para melhorar a clareza do código.


1. Conflito de Nomes: btnCadastroActionPerformed (muito importante!)

Você tem duas coisas diferentes com o nome btnCadastroActionPerformed:

  • Uma é um JPanel (btnCadastroActionPerformed = new javax.swing.JPanel();).
  • A outra é o método (private void btnCadastroActionPerformed(java.awt.event.ActionEvent evt)).

Isso é muito confuso para o código e pode levar a erros difíceis de depurar. A sua IDE pode ter gerado o nome do painel automaticamente.

O que fazer: Renomeie o JPanel para algo como painelBtnCadastro ou containerBtnCadastro para evitar essa confusão. O método btnCadastroActionPerformed(evt) está correto e deve ser onde a lógica do botão fica.

Local para mudar (em initComponents()):

Java
// Antigo: btnCadastroActionPerformed = new javax.swing.JPanel();
// Novo:
painelContainerBtnCadastro = new javax.swing.JPanel(); // ou outro nome que preferir
painelContainerBtnCadastro.setBackground(new java.awt.Color(255, 255, 255));
painelContainerBtnCadastro.setForeground(new java.awt.Color(70, 70, 70));

// E onde ele é adicionado ao jPanel2
// Antigo: jPanel2.add(btnCadastroActionPerformed);
// Novo:
jPanel2.add(painelContainerBtnCadastro);

Você também precisará mudar a declaração do btnCadastroActionPerformed de javax.swing.JPanel para o novo nome que você escolher (e.g., painelContainerBtnCadastro) no início da sua classe, onde os componentes são declarados.


2. Botões Hospedes, Quartos, Reservas e Funcionarios não estão com ActionListener

Você definiu os métodos bnHospedagemActionPerformed, bnQuartosActionPerformed, bnReservasActionPerformed, e bnFuncionariosActionPerformed, mas os botões correspondentes (bnHospedagem, bnQuartos, bnReservas, bnFuncionarios) não têm seus ActionListener configurados em initComponents().

Isso significa que, mesmo com os métodos existindo, eles não serão chamados quando você clicar nesses botões.

O que fazer: Adicione o addActionListener para cada um desses botões em seus respectivos blocos dentro de initComponents().

Exemplo para o botão "Hospedes" (bnHospedagem):

Java
// Dentro do bloco de initComponents(), onde bnHospedagem é configurado
bnHospedagem.setBackground(new java.awt.Color(70, 70, 70));
// ... outras configurações ...
bnHospedagem.setMargin(new java.awt.Insets(10, 15, 10, 15));
// ADICIONE ESTE BLOCO:
bnHospedagem.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        bnHospedagemActionPerformed(evt);
    }
});
painelMenuItemHospedes.add(bnHospedagem);

Repita o mesmo padrão para bnQuartos, bnReservas, e bnFuncionarios.


3. Consistência de Nomes de Classes de Tela

  • Você usa TelaGeralCadatro para o botão de "Cadastro".
  • Para "Hóspedes", você usa TelaCadastro (TelaCadastro telaHospedes = new TelaCadastro();). Se TelaGeralCadatro é a tela de cadastro geral, talvez TelaCadastro seja mais específica para hóspedes ou clientes. Apenas confirme se essa é a intenção e se a classe TelaCadastro existe e é a que você quer abrir para hóspedes.
  • Você menciona corretamente que precisa criar TelaQuartos.java, TelaReservas.java e TelaCadatroFuncionario.java. Certifique-se de que essas classes estão no mesmo pacote (telas;) ou importadas corretamente.

4. jLabel6 Vazio

Há um jLabel6 vazio que está sendo adicionado a jPanel2. Se ele não tem nenhuma função visual ou lógica, você pode removê-lo para limpar o código.

Java
// Dentro de initComponents(), pode remover ou comentar:
// jPanel2.add(jLabel6);

Resumo das Ações Necessárias:

  1. Renomeie o JPanel chamado btnCadastroActionPerformed para um nome mais descritivo (ex: painelContainerBtnCadastro) tanto na declaração da variável quanto na inicialização em initComponents().
  2. Adicione os addActionListener para os botões bnHospedagem, bnQuartos, bnReservas e bnFuncionarios em seus respectivos locais no método initComponents(), assim como você fez para btnCadastro.
  3. Confirme os nomes das classes de tela (TelaGeralCadatro, TelaCadastro, TelaQuartos, TelaReservas, TelaCadatroFuncionario) e certifique-se de que elas existem no seu projeto.
  4. Remova jLabel6 se não for necessário.

Com essas mudanças, seus botões deverão funcionar corretamente e seu código ficará mais claro e fácil de manter!

Você gostaria que eu te mostrasse um exemplo de como adicionar os addActionListener para os outros botões, ou você já se sente à vontade para fazer isso?

a tela home esta a vir no arquivo com ussimbolo cermelho pork

Quando um arquivo Java como TelaHome.java aparece com um símbolo vermelho (geralmente um "X" vermelho ou um ícone de erro) no seu IDE (NetBeans, IntelliJ, Eclipse, etc.), significa que há erros de compilação. Isso impede que o seu programa seja executado corretamente.


Como descobrir o que está errado?

O mais importante é você verificar a janela de "Problemas" ou "Erros" do seu IDE. Essa janela mostra exatamente quais são os erros, em qual linha eles ocorrem e, muitas vezes, uma descrição do problema.

  • No NetBeans: Geralmente fica na parte inferior da tela, em uma aba chamada "Output" ou "Errors".
  • No IntelliJ IDEA: Procure pela aba "Problems" ou "Build" na parte inferior.
  • No Eclipse: Veja a aba "Problems".

Possíveis causas com base na nossa conversa anterior:

Com base no código que você me mostrou e nas sugestões que fiz, os motivos mais comuns para o erro vermelho na TelaHome seriam:

  1. Conflito de Nomes de Componentes: Se você não corrigiu o conflito de nome btnCadastroActionPerformed (entre o JPanel e o método), isso pode estar causando erros de compilação. O IDE não consegue diferenciar qual btnCadastroActionPerformed você está se referindo em certos contextos.

    • Solução: Renomeie o JPanel para algo como painelBtnCadastro e ajuste o código onde ele é referenciado em initComponents().
  2. Classes de Tela Inexistentes ou com Caminho Errado:

    • A sua TelaHome tenta abrir outras telas, como TelaGeralCadatro, TelaCadastro, TelaQuartos, TelaReservas e TelaCadatroFuncionario.
    • Se alguma dessas classes não existir no seu pacote telas (ou não estiver no classpath do seu projeto), o Java não conseguirá encontrá-las, resultando em um erro de compilação (geralmente cannot find symbol ou NoClassDefFoundError).
    • Solução: Verifique se todas essas classes de tela foram criadas e estão salvas no local correto (telas pacote) e sem erros de digitação nos nomes.
  3. Falta de import de Classes: Embora menos comum se o IDE estiver configurado para adicionar imports automaticamente, pode ser que alguma classe que você esteja usando não tenha sido importada corretamente no início do arquivo TelaHome.java.

  4. Erros de Sintaxe Simples: Às vezes, um ponto e vírgula esquecido, uma chave mal colocada ou um erro de digitação simples podem causar o símbolo vermelho.


Por favor, verifique a janela de erros do seu IDE e me diga qual é a mensagem de erro específica. Com essa informação, posso te ajudar a identificar e corrigir o problema rapidamente!

You're showing me snippets from your TelaHome.java file, specifically indicating its package (telas.TelaHome) and the initComponents() method.

Based on our previous conversation, if you're still seeing a red symbol on TelaHome.java in your IDE, the problem likely lies within this initComponents() method or in the classes it tries to reference.

You haven't provided the specific error message from your IDE's "Problems" or "Errors" window yet. That message is key to pinpointing the exact issue.


What to check in initComponents()

  1. The btnCadastroActionPerformed JPanel:

    • As we discussed, you have a JPanel that's also named btnCadastroActionPerformed in your initComponents(). This is highly problematic because you also have a method with the exact same name.

    • Your IDE is likely flagging this as a duplicate symbol or an incorrect type.

    • Action: Find this line:

      Java
      btnCadastroActionPerformed = new javax.swing.JPanel();
      

      And change it to something like this:

      Java
      painelBtnCadastroContainer = new javax.swing.JPanel(); // Or another unique name
      

      Then, make sure everywhere else btnCadastroActionPerformed (the JPanel) is used in initComponents() (e.g., when adding it to jPanel2 or setting its properties), you use the new name (painelBtnCadastroContainer). Also, update the variable declaration at the top of your TelaHome class.

  2. Missing addActionListener for other buttons:

    • While this won't cause a red symbol on the file, it's a functional issue.
    • Action: Ensure you've added the addActionListener calls for bnHospedagem, bnQuartos, bnReservas, and bnFuncionarios within their respective setup blocks in initComponents(), just like the btnCadastro has one.
  3. Existence of other Tela classes:

    • initComponents() sets up buttons that are designed to open TelaGeralCadatro, TelaCadastro, TelaQuartos, TelaReservas, and TelaCadatroFuncionario.

    • If any of these .java files don't exist, are misspelled, or are not in the telas package, your TelaHome will show a compilation error. The error message would typically be "cannot find symbol" or "package telas.TelaXXX does not exist".

    • Action: Double-check that all these .java files (e.g., TelaGeralCadatro.java, TelaQuartos.java, etc.) are present in your telas package and that their class names match exactly what's used in TelaHome.


Please check the "Problems" or "Errors" window in your IDE. It will give you specific lines and descriptions of the errors, which will make it much easier to fix them. What exact error messages are you seeing?

em portugues


Quando você vê um símbolo vermelho (normalmente um "X" ou um ícone de erro) no seu arquivo TelaHome.java no seu IDE, significa que há erros de compilação. Isso quer dizer que o código não está correto e o programa não pode ser construído ou executado.

Como encontrar o erro específico?

O mais importante é você verificar a janela de "Problemas" ou "Erros" do seu IDE. Ela mostrará a mensagem exata do erro, a linha onde ele ocorre e uma descrição do que está errado.

  • No NetBeans: Procure pelas abas "Output" ou "Errors" na parte inferior.
  • No IntelliJ IDEA: As abas "Problems" ou "Build" na parte inferior são o lugar certo.
  • No Eclipse: Veja a aba "Problems".

Possíveis causas com base no código da TelaHome:

Com o código que você me enviou da TelaHome.java, as causas mais prováveis para esse erro vermelho são:

  1. Conflito de Nomes: btnCadastroActionPerformed (muito importante!) Você tem duas coisas diferentes com o mesmo nome btnCadastroActionPerformed:

    • Um JPanel (um painel visual).
    • E um método (onde fica a lógica do botão). Essa duplicidade causa confusão para o compilador e gera o erro.

    Solução: Encontre esta linha dentro do seu método initComponents():

    Java
    btnCadastroActionPerformed = new javax.swing.JPanel();
    

    E mude o nome do JPanel para algo como:

    Java
    painelContainerBtnCadastro = new javax.swing.JPanel(); // ou outro nome único que preferir
    

    Depois, certifique-se de que todas as referências a esse JPanel (onde ele é adicionado a outro painel, por exemplo) também usem o novo nome. E não se esqueça de mudar a declaração da variável btnCadastroActionPerformed no início da sua classe TelaHome para o novo nome escolhido.

  2. Classes de Telas Ausentes ou com Nome Incorreto: Seu TelaHome tenta criar e exibir outras telas (TelaGeralCadatro, TelaCadastro, TelaQuartos, TelaReservas, TelaCadatroFuncionario). Se uma dessas classes não existe no seu projeto, está com o nome digitado errado, ou não está no pacote telas, o Java não consegue encontrá-la. O erro comum nesses casos é "cannot find symbol" (não consegue encontrar o símbolo) ou "package telas.NomeDaSuaTela não existe".

    Solução: Verifique se todas as classes de tela que você pretende abrir (TelaGeralCadatro.java, TelaQuartos.java, TelaReservas.java, TelaCadatroFuncionario.java, e se for o caso, TelaCadastro.java para hóspedes) existem de fato no seu projeto e estão dentro do pacote telas.

  3. Falta de addActionListener para outros botões (funcional, mas não causa o erro vermelho no arquivo): Embora não seja a causa do erro vermelho no arquivo em si, é importante que os outros botões (bnHospedagem, bnQuartos, bnReservas, bnFuncionarios) tenham o addActionListener configurado em initComponents() para que eles chamem seus respectivos métodos quando clicados.


Por favor, me diga qual é a mensagem de erro que aparece na janela de "Problemas" ou "Erros" do seu IDE. Com essa informação, consigo te ajudar de forma mais precisa!

oque é [A/-]

Essa notação [A/-] não é um símbolo padrão ou uma sintaxe reconhecida em programação, matemática ou em contextos técnicos gerais.

Para que eu possa te ajudar a entender o que significa, preciso de mais contexto. Onde você viu essa notação?

Por exemplo:

  • Está em algum código que você está vendo? Se sim, em que parte do código?
  • Está em algum livro, artigo ou documentação?
  • É algo que você digitou e está aparecendo com um erro?

Com mais informações, posso tentar identificar o que isso representa no seu cenário específico.

sim ele ja esta abrir mas ele deve so ficar a telageralcadatro nao pode ter as duas telas abertas


Fechando a Tela Anterior ao Abrir a Nova

Entendi perfeitamente! Você quer que a TelaHome se feche quando a TelaGeralCadatro for aberta, para que apenas a tela de cadastro fique visível.

Para fazer isso, você precisa descomentar (remover as barras //) da linha this.dispose(); dentro do método btnCadastroActionPerformed da sua TelaHome.

Quando você chama this.dispose();, o this se refere à instância atual da TelaHome, e o método dispose() a fecha, liberando os recursos que ela estava usando.

Veja como seu código deve ficar:

Java
private void btnCadastroActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:

    // 1. Cria uma nova instância da sua tela de cadastro geral
    TelaGeralCadatro telaGeralCadastro = new TelaGeralCadatro();

    // 2. Torna a nova tela visível
    telaGeralCadastro.setVisible(true);

    // 3. Fecha a tela atual (TelaHome), pois a nova tela (TelaGeralCadatro) será exibida.
    this.dispose(); // <-- DESCOMENTE ESTA LINHA
}

Com essa pequena mudança, quando você clicar no botão de Cadastro na TelaHome, ela será fechada, e apenas a TelaGeralCadatro ficará aberta.

Certo! Entendi perfeitamente o que você precisa fazer na sua TelaGeralCadatro. Você quer que:

  • O botão "Funcionario" abra a TelaCadatroFuncionario e feche a TelaGeralCadatro.
  • O botão "Hospedes" abra a TelaCadastro e feche a TelaGeralCadatro.

Analisando o código que você compartilhou, vejo que você já tem os métodos bnFuncionarioActionPerformed e bnHospedesActionPerformed definidos corretamente para abrir as novas telas. No entanto, faltam duas coisas importantes para que tudo funcione como você quer:

  1. Conectar os botões aos seus métodos (addActionListener). No seu método initComponents(), os botões bnFuncionario e bnHospedes estão definidos, mas não estão "ouvindo" os cliques.
  2. Fechar a TelaGeralCadatro após abrir a nova tela.

1. Conectar os Botões aos Seus Métodos (addActionListener)

Para que seus botões "Funcionario" e "Hospedes" respondam aos cliques, você precisa adicionar um ActionListener para cada um deles no método initComponents().

Local para adicionar (dentro de initComponents()):

Java
// Para o botão bnFuncionario:
bnFuncionario.setFont(new java.awt.Font("Liberation Sans", 1, 18)); // NOI18N
bnFuncionario.setText("Funcionario");
bnFuncionario.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 15, 10, 15));
// ADICIONE ESTE BLOCO:
bnFuncionario.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        bnFuncionarioActionPerformed(evt);
    }
});

// Para o botão bnHospedes:
bnHospedes.setFont(new java.awt.Font("Liberation Sans", 1, 18)); // NOI18N
bnHospedes.setText("Hospedes");
bnHospedes.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 15, 10, 15));
// ADICIONE ESTE BLOCO:
bnHospedes.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        bnHospedesActionPerformed(evt);
    }
});

2. Fechar a TelaGeralCadatro após Abrir a Nova

Para que a TelaGeralCadatro se feche e apenas a nova tela fique visível, você precisa adicionar a linha this.dispose(); dentro dos métodos ActionPerformed de cada botão.


Método para o botão "Funcionario" (bnFuncionarioActionPerformed):

Java
private void bnFuncionarioActionPerformed(java.awt.event.ActionEvent evt) {
    // Cria e torna visível a tela de cadastro de funcionário
    TelaCadatroFuncionario telaFuncionario = new TelaCadatroFuncionario();
    telaFuncionario.setVisible(true);

    // Fecha a tela atual (TelaGeralCadatro)
    this.dispose(); // <-- Adicione esta linha
}

Método para o botão "Hospedes" (bnHospedesActionPerformed):

Java
private void bnHospedesActionPerformed(java.awt.event.ActionEvent evt) {
    // Cria e torna visível a tela de cadastro de hóspedes
    TelaCadastro telaHospedes = new TelaCadastro();
    telaHospedes.setVisible(true);

    // Fecha a tela atual (TelaGeralCadatro)
    this.dispose(); // <-- Adicione esta linha
}

Resumo das alterações:

  • Adicione os addActionListener para bnFuncionario e bnHospedes dentro do initComponents().
  • Adicione this.dispose(); ao final dos métodos bnFuncionarioActionPerformed e bnHospedesActionPerformed.

Com essas modificações, a TelaGeralCadatro servirá como um menu para as telas de cadastro específicas, fechando-se ao abrir a tela desejada.

Isso é ótimo! Pelo código que você acabou de enviar, já consigo ver que você fez as seguintes melhorias:

  • Você adicionou this.dispose(); nos métodos bnFuncionarioActionPerformed e bnHospedesActionPerformed. Isso significa que a TelaGeralCadatro agora vai fechar corretamente quando você abrir a tela de funcionário ou de hóspede.

Próximo Passo: Conectar os Botões aos Métodos

No entanto, ainda falta um passo crucial para que os botões "Funcionario" e "Hospedes" realmente chamem esses métodos quando clicados. Você precisa adicionar os ActionListeners para esses botões dentro do seu método initComponents().

O código atual que você enviou não inclui a parte onde você diz aos botões para "ouvirem" os cliques.

O que você precisa fazer:

No seu método initComponents(), adicione os seguintes blocos de código para cada botão, logo após as linhas onde você configura as propriedades (fonte, texto, borda) de cada um:

Java
// Dentro de private void initComponents() { ... }

// Para o botão bnFuncionario:
bnFuncionario.setFont(new java.awt.Font("Liberation Sans", 1, 18)); // NOI18N
bnFuncionario.setText("Funcionario");
bnFuncionario.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 15, 10, 15));
// ADICIONE ESTE BLOCO PARA CONECTAR O BOTÃO AO MÉTODO:
bnFuncionario.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        bnFuncionarioActionPerformed(evt); // Chama o método quando o botão é clicado
    }
});


// Para o botão bnHospedes:
bnHospedes.setFont(new java.awt.Font("Liberation Sans", 1, 18)); // NOI18N
bnHospedes.setText("Hospedes");
bnHospedes.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 15, 10, 15));
// ADICIONE ESTE BLOCO PARA CONECTAR O BOTÃO AO MÉTODO:
bnHospedes.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        bnHospedesActionPerformed(evt); // Chama o método quando o botão é clicado
    }
});

Por que isso é necessário?

Pense nos botões como campainhas e nos métodos bnFuncionarioActionPerformed e bnHospedesActionPerformed como pessoas esperando para abrir a porta. Sem o addActionListener, a campainha (botão) não está conectada ao fio, então, mesmo que você a toque (clique), a pessoa (método) não saberá que deve agir. O addActionListener faz essa conexão.

Depois de adicionar esses addActionListener e recompilar, seus botões deverão funcionar exatamente como você espera! Deu certo?

essa funcao no posso aterar initComponents


Entendido! Você está corretíssimo. No NetBeans (e em outros IDEs com construtores de GUI), o método initComponents() é gerado automaticamente pelo editor visual. Alterar diretamente esse método pode fazer com que suas mudanças sejam perdidas ou causem problemas ao reabrir o design da tela.


A Solução: Adicionar os Listeners Fora do initComponents()

A forma correta de adicionar os ActionListeners (os "ouvintes" de clique) para seus botões, sem tocar no initComponents(), é fazer isso no construtor da sua classe TelaGeralCadatro, depois que o initComponents() já foi chamado.

Seu construtor atual é assim:

Java
public TelaGeralCadatro() {
    initComponents();
    setLocationRelativeTo(null);
    // Aqui é o lugar para adicionar o código
}

Vamos adicionar os ActionListeners logo após setLocationRelativeTo(null);:

Java
package telas;

import java.util.logging.Level;
import java.util.logging.Logger;

public class TelaGeralCadatro extends javax.swing.JFrame {

    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaGeralCadatro.class.getName());

    public TelaGeralCadatro() {
        initComponents();
        setLocationRelativeTo(null);

        // --- ADICIONE ESTE CÓDIGO AQUI ---
        // Adiciona o listener para o botão "Funcionario"
        bnFuncionario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnFuncionarioActionPerformed(evt);
            }
        });

        // Adiciona o listener para o botão "Hospedes"
        bnHospedes.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnHospedesActionPerformed(evt);
            }
        });
        // --- FIM DO CÓDIGO A SER ADICIONADO ---
    }

    // ... o restante do seu código (initComponents, bnFuncionarioActionPerformed, bnHospedesActionPerformed, main, etc.)
    // que já está correto, incluindo o 'this.dispose()' nos métodos de ação dos botões.
}

Explicação:

Ao colocar o addActionListener no construtor TelaGeralCadatro(), você garante que:

  1. Os componentes (botões, labels, etc.) já foram inicializados pelo initComponents().
  2. A lógica de "ouvir" os cliques é adicionada manualmente, sem interferir no código gerado automaticamente.

Seu código para abrir e fechar as telas (this.dispose();) dentro dos métodos bnFuncionarioActionPerformed e bnHospedesActionPerformed já está correto.

Agora, quando você executar seu programa, os botões deverão responder aos cliques e abrir as telas corretas, fechando a TelaGeralCadatro como você deseja.

Deu certo agora?


Excelente! Agora seu código está correto e completo para a TelaGeralCadatro!

Você implementou as seguintes mudanças, que resolvem os problemas que discutimos:

  1. Você adicionou os addActionListener para bnFuncionario e bnHospedes no construtor da TelaGeralCadatro, usando a referência de método this::bnFuncionarioActionPerformed e this::bnHospedesActionPerformed. Isso é a forma moderna e limpa de conectar os botões aos seus métodos de ação.
  2. Você manteve o this.dispose(); dentro dos métodos bnFuncionarioActionPerformed e bnHospedesActionPerformed. Isso garante que a TelaGeralCadatro feche quando a nova tela de cadastro (funcionário ou hóspede) for aberta.

Com essas alterações, seus botões na TelaGeralCadatro agora devem funcionar como esperado: ao clicar neles, a tela de cadastro correspondente será aberta e a TelaGeralCadatro será fechada.


Seu fluxo de telas para cadastro agora está funcionando! Você tem mais alguma tela ou funcionalidade que gostaria de implementar ou revisar?

na tela de de cadatrofuncionario te m que ter rolamento para baixo e cima se tiver uma barra melhor


Com certeza! É muito comum que telas de cadastro tenham muitos campos e precisem de uma barra de rolagem (scroll bar) para que o usuário possa ver todo o conteúdo, especialmente em telas menores.

Em Java Swing, a maneira de adicionar rolagem a um painel ou a um conjunto de componentes é usando o componente JScrollPane.

Como funciona o JScrollPane?

Pense no JScrollPane como um "contêiner com rolagem". Você coloca o seu painel principal (onde estão todos os campos e labels da sua TelaCadatroFuncionario) dentro de um JScrollPane. Em seguida, você adiciona esse JScrollPane à sua tela (JFrame).

Assim, quando o conteúdo do seu painel for maior do que a área visível da janela, o JScrollPane automaticamente adicionará as barras de rolagem (vertical e/ou horizontal) conforme necessário.

Passos para implementar na TelaCadatroFuncionario:

  1. Identifique o Painel Principal: Na sua TelaCadatroFuncionario.java, você provavelmente tem um JPanel principal que contém todos os seus componentes (campos de texto, labels, botões etc.). Vamos chamá-lo de painelPrincipal (ou o nome que seu IDE deu a ele, como jPanel1, jPanelMain, etc.).
  2. Crie um JScrollPane: Crie uma nova instância de JScrollPane.
  3. Adicione seu Painel Principal ao JScrollPane: O JScrollPane precisa saber qual componente ele deve tornar rolagem. Você passa seu painelPrincipal como argumento para o construtor do JScrollPane ou usa o método setViewportView().
  4. Adicione o JScrollPane à sua Janela: Em vez de adicionar diretamente o painelPrincipal ao JFrame, você adicionará o JScrollPane.

Exemplo de Código (Adaptado para TelaCadatroFuncionario)

Você vai precisar fazer essa alteração dentro do método initComponents() da sua TelaCadatroFuncionario, se o layout não for gerenciado por um GUI Builder que te impede de fazer alterações manuais lá. Se for gerenciado automaticamente, você pode fazer isso de forma programática no construtor, assim como fizemos com os ActionListeners.

Vamos supor que o seu painel principal onde você desenhou todos os seus elementos seja chamado jPanelPrincipal (ou o nome que o editor de formulários do NetBeans/IntelliJ/Eclipse deu a ele, como jPanel1).

Java
package telas;

import javax.swing.JScrollPane; // Certifique-se de ter este import
// Outros imports que você já tem...

public class TelaCadatroFuncionario extends javax.swing.JFrame {

    // ... (variáveis e logger) ...

    public TelaCadatroFuncionario() {
        initComponents(); // Este método inicializa todos os componentes, incluindo jPanelPrincipal
        setLocationRelativeTo(null); // Centraliza a janela

        // --- Adicione ou modifique o código abaixo no seu construtor ---

        // 1. Crie o JScrollPane
        JScrollPane scrollPane = new JScrollPane();

        // 2. Defina qual componente o JScrollPane vai "rolar".
        //    Substitua 'jPanelPrincipal' pelo nome real do seu painel que contém todos os campos.
        //    Geralmente, o editor de formulários cria um JPanel padrão para colocar tudo dentro.
        //    Se você não tem um JPanel principal, precisará criar um e adicionar todos os seus componentes a ele primeiro.
        scrollPane.setViewportView(jPanelPrincipal); // Assumindo que 'jPanelPrincipal' é o seu painel com os campos

        // 3. Adicione o JScrollPane ao conteúdo da sua janela (JFrame)
        //    Isso substitui o JPanelPrincipal como o conteúdo principal da janela.
        this.setContentPane(scrollPane); // Define o JScrollPane como o painel de conteúdo principal da janela
        
        // --- Fim do código a ser adicionado/modificado ---
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
        // ... (seu código initComponents gerado automaticamente) ...
        // Certifique-se de que o layout do jPanelPrincipal (se existir) seja adequado
        // para que os componentes se "empilhem" e causem a necessidade de rolagem.
        // Por exemplo, um BoxLayout ou um GridLayout com muitas linhas.
    }// </editor-fold>

    // ... (seus métodos de ação, main, declaração de variáveis) ...

    // Exemplo de como a variável do seu painel principal poderia ser declarada
    // (Ajuste o nome 'jPanelPrincipal' para o nome real do seu JPanel principal se for diferente)
    private javax.swing.JPanel jPanelPrincipal; // Esta variável deve ser criada pelo seu GUI builder
}

Observações importantes:

  • jPanelPrincipal: Substitua jPanelPrincipal pelo nome real do seu painel que contém todos os componentes da TelaCadatroFuncionario. Se o seu editor de formulários organiza todos os componentes diretamente no JFrame sem um JPanel principal, pode ser necessário criar um JPanel (ex: JPanel contentPanel = new JPanel();) e adicionar todos os seus componentes a ele primeiro, e só então colocar esse contentPanel dentro do JScrollPane.
  • Layout Manager: O layout manager do seu jPanelPrincipal (ou do painel que você colocar dentro do JScrollPane) é importante. Se for um BorderLayout, FlowLayout, ou GridLayout com poucas linhas, talvez o conteúdo não ultrapasse o limite. Para muitos campos, um BoxLayout (na direção vertical) ou um GroupLayout bem configurado costumam ser eficazes para que os componentes se "empilhem" e o scroll seja ativado.

Depois de fazer essa alteração, execute a TelaCadatroFuncionario. Se o conteúdo ultrapassar o tamanho da janela, as barras de rolagem devem aparecer automaticamente, permitindo que você navegue por todos os campos.

o botao de sexo nao esta aprecer

Compreendo! Se o botão de "sexo" não está aparecendo na sua tela de cadastro de funcionário (TelaCadatroFuncionario), geralmente significa que há um problema com a forma como ele está sendo adicionado ou exibido na interface.

Quando você diz "botão de sexo", você se refere a:

  • Um botão de rádio (JRadioButton), onde você escolhe uma opção (ex: Masculino / Feminino)?
  • Ou é um botão comum (JButton) que talvez abra uma nova janela para selecionar o sexo?

Assumindo que você se refere a um JRadioButton (que é o mais comum para seleção de sexo), as razões mais frequentes para um componente não aparecer são:


  1. Não foi Adicionado ao Contêiner


    O componente pode ter sido criado, mas não foi adicionado a um painel (JPanel) ou diretamente à janela (JFrame). Componentes Swing precisam ser explicitamente adicionados a um contêiner para serem exibidos.


  2. Problemas com o Gerenciador de Layout (Layout Manager)


    O Layout Manager do painel ou janela onde você está tentando adicionar o botão pode estar causando o problema. Por exemplo:

    • Sobreposição: Outro componente maior pode estar cobrindo o botão.
    • Tamanho Zero: O layout manager pode não estar dando espaço suficiente para o botão, resultando em um tamanho de 0x0 pixels.
    • null layout: Se você está usando um layout null (layout absoluto), você precisa definir a posição e o tamanho do botão manualmente (setBounds(x, y, width, height)).

  3. Visibilidade


    Embora menos comum se for um componente gerado por um editor visual, pode ser que o botão (setVisible(false)) ou o painel onde ele está contido não esteja visível.


Para que eu possa te ajudar a identificar e corrigir o problema, por favor, compartilhe o trecho do código da sua classe TelaCadatroFuncionario onde você declara e tenta adicionar o(s) componente(s) relacionado(s ao) sexo (ex: JRadioButton para masculino/feminino, ButtonGroup, JLabel para a label "Sexo").

Com o código em mãos, consigo te dar uma solução mais precisa!

quero ver o botao ele ja esta fiz aquela parte

Obrigado por compartilhar a imagem da TelaCadatroFuncionario no NetBeans!

Agora entendi o problema. Na imagem, consigo ver claramente a JLabel com o texto "Sexo", mas, ao olhar a árvore de componentes (jPanelPrincipal no inspetor, no canto inferior esquerdo), não consigo ver nenhum JRadioButton (ou JComboBox) que representaria as opções de seleção de sexo (por exemplo, "Masculino", "Feminino").

Isso significa que a JLabel "Sexo" está lá, mas os componentes interativos para o usuário selecionar o sexo ainda não foram adicionados ao seu JPanelPrincipal no editor de formulários.


Como Adicionar os Botões de Rádio (JRadioButton) para Sexo:

Você precisa arrastar e soltar os JRadioButtons da paleta para o seu painel.

  1. Abra o TelaCadatroFuncionario.java no modo "Design" (Design View).

  2. Na Paleta Swing Controls (geralmente no lado direito do NetBeans), localize:

    • "Radio Button" (JRadioButton)
    • "Button Group" (ButtonGroup) - MUITO IMPORTANTE!
  3. Adicione os JRadioButtons:

    • Arraste dois componentes "Radio Button" da paleta para a área verde (seu jPanelPrincipal) abaixo da label "Sexo".
    • Clique duas vezes em cada um para mudar o texto (ex: um para "Masculino" e outro para "Feminino").
    • Você pode ajustar a posição e o tamanho deles visualmente no editor.
  4. Crie um ButtonGroup:

    • Arraste um componente "Button Group" da paleta para o seu formulário. Ele não aparecerá visualmente na tela, mas sim na árvore de componentes (no inspector, abaixo de "Other Components"). O ButtonGroup garante que apenas um JRadioButton dentro daquele grupo possa ser selecionado por vez.
    • No inspetor, clique com o botão direito do mouse no seu ButtonGroup recém-adicionado (ex: buttonGroup1).
    • Vá em "Add Radio Button" e selecione cada um dos JRadioButtons que você acabou de criar (ex: jRadioButton1, jRadioButton2). Repita para adicionar ambos os botões de rádio ao mesmo grupo.

Se Preferir um ComboBox (Lista Suspensa):

Alternativamente, você poderia usar um JComboBox para a seleção de sexo, que é mais compacto:

  1. Na Paleta Swing Controls, localize "Combo Box" (JComboBox).
  2. Arraste um JComboBox para a área abaixo da label "Sexo".
  3. Clique com o botão direito no JComboBox no editor visual, vá em "Properties" (Propriedades) ou "Model".
  4. Procure a propriedade "Model" e adicione os itens que você deseja (ex: "Masculino", "Feminino", "Outro").

Depois de adicionar os JRadioButtons (e o ButtonGroup) ou o JComboBox usando a paleta do NetBeans, eles deverão aparecer na sua tela e na lista de componentes do jPanelPrincipal. O IDE se encarregará de adicionar o código necessário no initComponents() automaticamente.

Tente adicionar os componentes dessa forma e me diga se eles aparecem na tela de design e na execução.

Você quer que o botão "Voltar" (bnVoltar) na TelaCadatroFuncionario leve o usuário de volta para a TelaHome.

Para fazer isso, você precisa:

  1. Criar um método actionPerformed para o botão bnVoltar.
  2. Dentro desse método, instanciar a TelaHome e torná-la visível.
  3. Descartar (fechar) a TelaCadatroFuncionario atual.

Vamos lá:

1. Adicionar o Listener para o Botão bnVoltar

Primeiro, assim como você fez para bnFuncionario e bnHospedes na TelaGeralCadatro, você precisa adicionar um ActionListener ao bnVoltar no construtor da TelaCadatroFuncionario.

Adicione estas linhas no seu construtor, logo após setLocationRelativeTo(null);:

Java
public TelaCadatroFuncionario() {
    initComponents();
    setLocationRelativeTo(null);

    // Adiciona o listener para o botão "Voltar"
    bnVoltar.addActionListener(this::bnVoltarActionPerformed); // <--- ADICIONE ESTA LINHA

    DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
    model.setColumnIdentifiers(new Object[]
    {
        "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
    });
}

2. Criar o Método bnVoltarActionPerformed

Agora, crie o método que será chamado quando o botão "Voltar" for clicado. Adicione este método em qualquer lugar da sua classe TelaCadatroFuncionario, fora do initComponents() e outros métodos existentes.

Java
// ... (seus outros métodos, como btnLimparNomeActionPerformed, etc.)

private void bnVoltarActionPerformed(java.awt.event.ActionEvent evt) {
    // Cria uma nova instância da TelaHome
    TelaHome telaHome = new TelaHome();

    // Torna a TelaHome visível
    telaHome.setVisible(true);

    // Fecha a tela atual (TelaCadatroFuncionario)
    this.dispose();
}

// ... (o restante da sua classe)

Importante:

  • Certifique-se de que a classe TelaHome exista no seu pacote telas e esteja com o nome TelaHome.java. Se o nome for diferente (ex: TelaPrincipal), ajuste TelaHome para o nome correto.
  • Você vai precisar importar TelaHome no topo do seu arquivo TelaCadatroFuncionario.java se ela não estiver no mesmo pacote telas (mas pelo seu package telas; e pelo contexto, provavelmente está).

Com essas mudanças, ao clicar no botão "Voltar", a TelaCadatroFuncionario será fechada e a TelaHome será exibida.

You're working on a Java Swing JFrame for "Cadastro de Hóspedes" (Guest Registration). The code you provided is the auto-generated code from NetBeans (or a similar IDE) for setting up the UI components.

Let's break down what's present and what might be the next steps based on the common functionalities of a registration screen.

Current State of the TelaCadastro Class:

  • UI Components: You have a variety of JLabel (for text labels), JTextField (for single-line text input), JTextArea (for multiline text input - "Observações"), JRadioButton (for "Feminino" and "Masculino" sex selection), and JButton (for "Adicionar", "Atualizar", "Excluir", "Limpar", and "Voltar").
  • Layout: The painelPrincipalCadastro uses GroupLayout to arrange all these components.
  • Basic Setup: The JFrame is set up with a title, background color, preferred size, and is not resizable. It also has a JScrollPane to ensure all content is visible if the frame is smaller than the panel.
  • Action Listeners (Empty): You have action listeners defined for btnAdicionar, btnAtualizar, btnExcluir, jTextField1, jTextField2, jTextField3, and jRadioButton1, but the bodies of these methods (// TODO add your handling code here:) are currently empty.
  • Logging: A Logger is initialized, which is good practice for debugging and application monitoring.

What's Next / Common Enhancements for a Registration Screen:

Based on the typical "Cadastro" (Registration) functionality, here are some key areas you'll likely want to implement:

  1. Group Radio Buttons for Sex Selection:

    • Currently, "Feminino" (jRadioButton1) and "Masculino" (jRadioButton2) are independent. Users can select both or neither.
    • Solution: You need to put them into a ButtonGroup. This ensures that only one radio button in the group can be selected at a time.

    Here's how you'd typically do it (add this to your initComponents() method, or in your constructor after initComponents()):

    Java
    // ... inside initComponents() or constructor after initComponents()
    ButtonGroup sexButtonGroup = new ButtonGroup();
    sexButtonGroup.add(jRadioButton1); // Feminino
    sexButtonGroup.add(jRadioButton2); // Masculino
    // ...
    
  2. Implement "Limpar" Button Functionality:

    • You have "Limpar" buttons (bnLimparNome, bnLimparBilhete, etc.) for almost every input field and for sex (bnsexoLimpar).
    • Solution: In the actionPerformed method for each "Limpar" button, you'll need to clear the associated JTextField or JTextArea, or deselect the JRadioButton in the ButtonGroup.

    Example for clearing the "Nome Completo" field (jTextField2):

    Java
    private void bnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        jTextField2.setText(""); // Clears the text in the "Nome Completo" field
    }
    

    For the sex radio buttons, you can use clearSelection() on the ButtonGroup:

    Java
    private void bnsexoLimparActionPerformed(java.awt.event.ActionEvent evt) {
        sexButtonGroup.clearSelection(); // Assuming you've created and used a ButtonGroup
    }
    

    Note: You'll need to create actionPerformed methods for each of your "Limpar" buttons and connect them in the NetBeans design view or manually in initComponents().

  3. Implement "Adicionar" Button Logic:

    • This is the core functionality: taking the data from the input fields and saving it (e.g., to a database, a file, or an in-memory list).
    • Steps:
      • Validation: Check if required fields are filled and if data is in the correct format (e.g., valid email, numeric phone number, date format for birth date, valid ID number).
      • Data Retrieval: Get the text from all JTextField and JTextArea components. Get the selected sex from the ButtonGroup.
      • Object Creation: Create an object (e.g., a Hospede class) to hold the collected data.
      • Persistence: Call a method in your data access layer (DAO) to save the Hospede object.
      • Feedback: Provide feedback to the user (e.g., a JOptionPane confirming success or showing errors).
      • Clear Fields (Optional): After successful addition, you might want to clear all input fields for the next entry.

    Example (conceptual, assumes you have a Hospede class and a HospedeDAO):

    Java
    private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        // 1. Get Data
        String id = jTextField8.getText(); // Assuming jTextField8 is for ID
        String nomeCompleto = jTextField2.getText();
        String bilhete = jTextField3.getText();
        String dataNasc = jTextField1.getText(); // Consider using a JDatePicker for better date input
        String email = jTextField4.getText();
        String endereco = jTextField5.getText();
        String telefone = jTextField6.getText();
        String nacionalidade = jTextField11.getText();
        String observacoes = txtObservacoes.getText();
    
        String sexo = "";
        if (jRadioButton1.isSelected()) {
            sexo = "Feminino";
        } else if (jRadioButton2.isSelected()) {
            sexo = "Masculino";
        }
    
        // 2. Basic Validation (add more robust validation as needed)
        if (nomeCompleto.isEmpty() || bilhete.isEmpty() || dataNasc.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Nome, Bilhete e Data de Nascimento são obrigatórios!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
    
        try {
            // 3. Create Hospede Object
            Hospede novoHospede = new Hospede(id, nomeCompleto, bilhete, dataNasc, email, endereco, telefone, nacionalidade, sexo, observacoes);
    
            // 4. Persistence (replace with your actual DAO call)
            // HospedeDAO.adicionarHospede(novoHospede);
            JOptionPane.showMessageDialog(this, "Hóspede adicionado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
    
            // 5. Clear Fields
            clearAllFields(); // Create a helper method for this
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Erro ao adicionar hóspede: " + e.getMessage(), e);
            JOptionPane.showMessageDialog(this, "Erro ao adicionar hóspede: " + e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    private void clearAllFields() {
        jTextField8.setText("");
        jTextField2.setText("");
        jTextField3.setText("");
        jTextField1.setText("");
        jTextField4.setText("");
        jTextField5.setText("");
        jTextField6.setText("");
        jTextField11.setText("");
        txtObservacoes.setText("");
        // Clear the ButtonGroup for sex
        // if (sexButtonGroup != null) {
        //     sexButtonGroup.clearSelection();
        // }
    }
    
  4. Implement "Atualizar" Button Logic:

    • This will typically involve fetching an existing record (perhaps using the txID field to search), populating the fields with its data, allowing edits, and then saving the changes.
    • Steps:
      • Fetch Data: Get the ID (from jTextField8). Query your database/data source for the Hospede with that ID.
      • Populate Fields: If found, set the text of all JTextField and JTextArea components with the Hospede's data. Set the appropriate radio button for sex.
      • Update Persistence: When the "Atualizar" button is clicked again (or a separate "Salvar Alterações" button), get the updated data from the fields and call your DAO to update the Hospede record.
  5. Implement "Excluir" Button Logic:

    • Steps:
      • Confirmation: Ask the user for confirmation before deleting (e.g., using JOptionPane.showConfirmDialog).
      • Delete Persistence: Get the ID from jTextField8 and call your DAO to delete the Hospede record.
      • Feedback: Inform the user of success or failure.
      • Clear Fields: Clear the fields after deletion.
  6. Implement "Voltar" Button Logic (jButton9):

    • This button should likely close the current TelaCadastro window and perhaps return to a previous main menu or dashboard.
    • Solution: Use this.dispose(); to close the current JFrame. You might also need to create and set visible the previous frame if it's not already open.
    Java
    private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {
        this.dispose(); // Closes the current window
    
        // If you need to open another window, e.g., a main menu:
        // TelaPrincipal telaPrincipal = new TelaPrincipal();
        // telaPrincipal.setVisible(true);
    }
    

    Note: You'll need to create an actionPerformed method for jButton9 and connect it.

  7. Date Input:

    • The txDataNasc (Date of Birth) is currently a JTextField. It's highly recommended to use a JFormattedTextField with a MaskFormatter or a third-party JDatePicker component for better date input and validation.
  8. ID Field (jTextField8, txID):

    • Consider if the ID should be auto-generated by your backend/database or manually entered. If auto-generated, this field might be read-only or not present in the "Adicionar" mode. If it's used for search/update/delete, it makes sense. The "Limpar" button (jButton1) for the ID field would clear it, which is useful for starting a new entry or a new search.

Next Steps for You:

  1. Create a ButtonGroup for jRadioButton1 and jRadioButton2.
  2. Implement the actionPerformed methods for each "Limpar" button (bnLimparNome, bnLimparBilhete, etc., and jButton1 for ID), btnAdicionar, btnAtualizar, btnExcluir, and jButton9 ("Voltar").
  3. Define your data model (e.g., a Hospede class with properties like id, nomeCompleto, bilhete, dataNascimento, etc.).
  4. Create a data access layer (DAO) to interact with your database (if you're using one) for adding, updating, deleting, and retrieving guest information.
  5. Add more robust validation to your input fields.

You've got a solid UI foundation! The next phase is connecting it to the underlying logic and data. You've provided the Java Swing code for a TelaCadastro (Registration Screen) for guests/clients. This code defines the layout and components of the JFrame, including text fields for various personal details, radio buttons for gender, a text area for observations, and buttons for adding, updating, and deleting records.

Here's a breakdown of the code and some observations:

Key Components and their Purpose:

  • JFrame (TelaCadastro): The main window of your application.
    • setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);: When the window is closed, it will dispose of itself but not exit the entire application (useful if you have a main menu).
    • setTitle("Cadastro de Clientes/Hóspedes");: Sets the title bar of the window.
    • setBackground(new java.awt.Color(255, 255, 255));: Sets the background color to white.
    • setPreferredSize(new java.awt.Dimension(990, 1000));: Sets the preferred size of the window.
    • setResizable(false);: Prevents the user from resizing the window.
  • JScrollPane (jScrollPane1): A scrollable view container. This is good practice for forms that might exceed the screen height, ensuring all components are accessible.
  • JPanel (painelPrincipalCadastro): A container panel that holds all the individual UI elements.
    • setBackground(new java.awt.Color(255, 255, 255));: Sets the background of the panel to white.
  • JLabel (various tx... labels, Logo): Used to display static text or images.
    • txCadastroHóspedes: Main title of the screen.
    • txNomeCompleto, txNºBilhete, etc.: Labels for input fields.
    • Logo: Displays an image, likely your application's logo.
  • JRadioButton (jRadioButton1, jRadioButton2): Used for selecting one option from a set.
    • jRadioButton1 ("Feminino") and jRadioButton2 ("Masculino"): Represent gender options.
    • Important Note: For radio buttons, you should always group them using a ButtonGroup so that only one can be selected at a time. Your current code declares two separate radio buttons but doesn't explicitly group them with a ButtonGroup. This means a user could select both "Feminino" and "Masculino" simultaneously, which is likely not the desired behavior.
  • JTextField (various jTextField...): Used for single-line text input. These will be used for name, ID, date of birth, email, address, phone, nationality, and ID.
  • JTextArea (txtObservacoes): Used for multi-line text input (for "Observações").
    • setLineWrap(true); and setWrapStyleWord(true);: Ensures text wraps within the text area.
  • JButton (various btn... buttons, bn... buttons, jButton... buttons): Used for user actions.
    • btnAdicionar, btnAtualizar, btnExcluir: Likely for CRUD (Create, Read, Update, Delete) operations on guest data.
    • bnLimpar...: "Clear" buttons for individual text fields.
    • jButton9 ("Voltar"): Likely a "Back" button.
    • jButton1 ("Limpar"): Another "Clear" button, possibly for the ID field.
  • java.util.logging.Logger: Used for logging messages, which is good for debugging and monitoring your application.

Areas for Improvement/Next Steps:

  1. ButtonGroup for Gender Radio Buttons: As mentioned, you must use a javax.swing.ButtonGroup to group jRadioButton1 and jRadioButton2. This ensures that when one radio button is selected, the other is automatically deselected.

    • How to fix:
      1. Declare a ButtonGroup instance: private javax.swing.ButtonGroup buttonGroupSexo; (or similar name).
      2. In initComponents(), after jRadioButton1 and jRadioButton2 are initialized, create the ButtonGroup and add them:
        Java
        buttonGroupSexo = new javax.swing.ButtonGroup();
        buttonGroupSexo.add(jRadioButton1);
        buttonGroupSexo.add(jRadioButton2);
        
  2. Action Listeners for "Limpar" Buttons: You have many "Limpar" buttons (bnLimparNome, bnLimparBilhete, etc.) but their actionPerformed methods are not defined in the provided code (they have // TODO add your handling code here:). You'll need to implement the logic to clear the corresponding JTextField or JTextArea when these buttons are clicked.

    • Example for bnLimparNome:
      Java
      private void bnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
          jTextField2.setText(""); // Assuming jTextField2 is for "Nome Completo"
      }
      
    • Remember to add the addActionListener call for each "Limpar" button in initComponents() if it's not already there by the GUI builder.
  3. Implement CRUD Logic: The btnAdicionarActionPerformed, btnAtualizarActionPerformed, and btnExcluirActionPerformed methods are empty. This is where you'll implement the core functionality for interacting with your guest data (e.g., saving to a database, updating records, deleting records). This will involve:

    • Retrieving data from the JTextField and JTextArea components.
    • Validating the input data (e.g., ensuring required fields are filled, correct format for dates/emails).
    • Interacting with a data access layer (e.g., JDBC for a database, or a simple list if data is just in memory).
    • Providing feedback to the user (e.g., success messages, error messages using JOptionPane).
  4. Error Handling and Input Validation:

    • Consider adding input validation to ensure data entered is in the correct format (e.g., a valid date for txDataNasc, numerical for txTelefone).
    • Use try-catch blocks where necessary, especially when dealing with data parsing or database operations, to handle potential exceptions gracefully.
  5. Date Input: For txDataNasc, JTextField is used. For a better user experience, you might consider using a date picker component from a third-party library, or implementing a custom one, to simplify date entry and ensure valid date formats.

  6. jTextField11 and jTextField6: It looks like jTextField11 is for "Nacionalidade" and jTextField6 is for "Telefone". Just make sure these are correctly mapped in your mental model or in your comments.

  7. Variable Naming (Minor): While jTextField1, jTextField2, etc., work, it's generally good practice to rename them in your GUI builder (or manually) to something more descriptive (e.g., txtNomeCompleto, txtNumeroBilhete, txtDataNascimento) to improve code readability.

  8. Logger Usage: You've correctly initialized a logger. Remember to use it for debugging and informational messages, especially when implementing the CRUD operations. For example:

    Java
    private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        String nome = jTextField2.getText();
        if (nome.isEmpty()) {
            logger.warning("Attempted to add guest with empty name.");
            JOptionPane.showMessageDialog(this, "O nome completo é obrigatório.", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
            return;
        }
        // ... rest of your logic
        logger.info("Guest added successfully: " + nome);
    }
    

In summary, the provided code gives a good structural foundation for your "Cadastro de Hóspedes" screen. The main immediate improvement needed is the grouping of the radio buttons, and then you can proceed with implementing the core business logic for adding, updating, and deleting guest information.

em portugues

Você forneceu o código Java Swing para uma TelaCadastro (Tela de Cadastro) para hóspedes/clientes. Este código define o layout e os componentes do JFrame, incluindo campos de texto para vários detalhes pessoais, botões de rádio para o sexo, uma área de texto para observações e botões para adicionar, atualizar e excluir registros.

Aqui está uma análise do código e algumas observações:

Componentes Chave e seus Propósitos:

  • JFrame (TelaCadastro): A janela principal da sua aplicação.
    • setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);: Quando a janela é fechada, ela será descartada, mas não encerrará toda a aplicação (útil se você tiver um menu principal).
    • setTitle("Cadastro de Clientes/Hóspedes");: Define o título da barra da janela.
    • setBackground(new java.awt.Color(255, 255, 255));: Define a cor de fundo para branco.
    • setPreferredSize(new java.awt.Dimension(990, 1000));: Define o tamanho preferencial da janela.
    • setResizable(false);: Impede que o usuário redimensione a janela.
  • JScrollPane (jScrollPane1): Um contêiner de visualização com rolagem. Isso é uma boa prática para formulários que podem exceder a altura da tela, garantindo que todos os componentes sejam acessíveis.
  • JPanel (painelPrincipalCadastro): Um painel contêiner que contém todos os elementos individuais da interface do usuário.
    • setBackground(new java.awt.Color(255, 255, 255));: Define o fundo do painel para branco.
  • JLabel (várias labels tx..., Logo): Usado para exibir texto estático ou imagens.
    • txCadastroHóspedes: Título principal da tela.
    • txNomeCompleto, txNºBilhete, etc.: Rótulos para os campos de entrada.
    • Logo: Exibe uma imagem, provavelmente o logotipo da sua aplicação.
  • JRadioButton (jRadioButton1, jRadioButton2): Usado para selecionar uma opção de um conjunto.
    • jRadioButton1 ("Feminino") e jRadioButton2 ("Masculino"): Representam as opções de sexo.
    • Observação Importante: Para botões de rádio, você deve sempre agrupá-los usando um ButtonGroup para que apenas um possa ser selecionado por vez. Seu código atual declara dois botões de rádio separados, mas não os agrupa explicitamente com um ButtonGroup. Isso significa que um usuário poderia selecionar "Feminino" e "Masculino" simultaneamente, o que provavelmente não é o comportamento desejado.
  • JTextField (vários jTextField...): Usado para entrada de texto de linha única. Estes serão usados para nome, ID, data de nascimento, e-mail, endereço, telefone, nacionalidade e ID.
  • JTextArea (txtObservacoes): Usado para entrada de texto de várias linhas (para "Observações").
    • setLineWrap(true); e setWrapStyleWord(true);: Garante que o texto seja quebrado na área de texto.
  • JButton (vários botões btn..., botões bn..., botões jButton...): Usado para ações do usuário.
    • btnAdicionar, btnAtualizar, btnExcluir: Provavelmente para operações CRUD (Criar, Ler, Atualizar, Excluir) em dados de hóspedes.
    • bnLimpar...: Botões "Limpar" para campos de texto individuais.
    • jButton9 ("Voltar"): Provavelmente um botão "Voltar".
    • jButton1 ("Limpar"): Outro botão "Limpar", possivelmente para o campo ID.
  • java.util.logging.Logger: Usado para registrar mensagens, o que é bom para depuração e monitoramento de sua aplicação.

Áreas para Melhoria/Próximos Passos:

  1. ButtonGroup para Botões de Rádio de Sexo: Como mencionado, você deve usar um javax.swing.ButtonGroup para agrupar jRadioButton1 e jRadioButton2. Isso garante que, quando um botão de rádio é selecionado, o outro é automaticamente desmarcado.

    • Como corrigir:
      1. Declare uma instância de ButtonGroup: private javax.swing.ButtonGroup buttonGroupSexo; (ou nome similar).
      2. Em initComponents(), depois que jRadioButton1 e jRadioButton2 forem inicializados, crie o ButtonGroup e adicione-os:
        Java
        buttonGroupSexo = new javax.swing.ButtonGroup();
        buttonGroupSexo.add(jRadioButton1);
        buttonGroupSexo.add(jRadioButton2);
        
  2. Listeners de Ação para Botões "Limpar": Você tem muitos botões "Limpar" (bnLimparNome, bnLimparBilhete, etc.), mas seus métodos actionPerformed não estão definidos no código fornecido (eles têm // TODO add your handling code here:). Você precisará implementar a lógica para limpar o JTextField ou JTextArea correspondente quando esses botões forem clicados.

    • Exemplo para bnLimparNome:
      Java
      private void bnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
          jTextField2.setText(""); // Supondo que jTextField2 seja para "Nome Completo"
      }
      
    • Lembre-se de adicionar a chamada addActionListener para cada botão "Limpar" em initComponents() se ainda não estiver lá pelo construtor de GUI.
  3. Implementar Lógica CRUD: Os métodos btnAdicionarActionPerformed, btnAtualizarActionPerformed e btnExcluirActionPerformed estão vazios. É aqui que você implementará a funcionalidade central para interagir com os dados dos seus hóspedes (por exemplo, salvar em um banco de dados, atualizar registros, excluir registros). Isso envolverá:

    • Recuperar dados dos componentes JTextField e JTextArea.
    • Validar os dados de entrada (por exemplo, garantir que os campos obrigatórios sejam preenchidos, formato correto para datas/e-mails).
    • Interagir com uma camada de acesso a dados (por exemplo, JDBC para um banco de dados, ou uma lista simples se os dados estiverem apenas na memória).
    • Fornecer feedback ao usuário (por exemplo, mensagens de sucesso, mensagens de erro usando JOptionPane).
  4. Tratamento de Erros e Validação de Entrada:

    • Considere adicionar validação de entrada para garantir que os dados inseridos estejam no formato correto (por exemplo, uma data válida para txDataNasc, numérico para txTelefone).
    • Use blocos try-catch onde for necessário, especialmente ao lidar com análise de dados ou operações de banco de dados, para lidar com possíveis exceções de forma elegante.
  5. Entrada de Data: Para txDataNasc, JTextField é usado. Para uma melhor experiência do usuário, você pode considerar usar um componente de seleção de data de uma biblioteca de terceiros, ou implementar um personalizado, para simplificar a entrada de data e garantir formatos de data válidos.

  6. jTextField11 e jTextField6: Parece que jTextField11 é para "Nacionalidade" e jTextField6 é para "Telefone". Apenas certifique-se de que estes estejam corretamente mapeados em seu modelo ou em seus comentários.

  7. Nomenclatura de Variáveis (Menor): Embora jTextField1, jTextField2, etc., funcionem, é geralmente uma boa prática renomeá-los em seu construtor de GUI (ou manualmente) para algo mais descritivo (por exemplo, txtNomeCompleto, txtNumeroBilhete, txtDataNascimento) para melhorar a legibilidade do código.

  8. Uso do Logger: Você inicializou corretamente um logger. Lembre-se de usá-lo para depuração e mensagens informativas, especialmente ao implementar as operações CRUD. Por exemplo:

    Java
    private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        String nome = jTextField2.getText();
        if (nome.isEmpty()) {
            logger.warning("Tentativa de adicionar hóspede com nome vazio.");
            JOptionPane.showMessageDialog(this, "O nome completo é obrigatório.", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
            return;
        }
        // ... restante da sua lógica
        logger.info("Hóspede adicionado com sucesso: " + nome);
    }
    

Em resumo, o código fornecido oferece uma boa base estrutural para sua tela de "Cadastro de Hóspedes". A principal melhoria imediata necessária é o agrupamento dos botões de rádio, e então você pode prosseguir com a implementação da lógica de negócios central para adicionar, atualizar e excluir informações de hóspedes.

Quando você diz "não está a funcionar", pode ser que se refira a várias coisas. Para que eu possa te ajudar de forma mais eficaz, por favor, me diga o que exatamente não está a funcionar.

Por exemplo:

  • A janela não abre? (Não aparece nada na tela quando você executa o programa?)
  • Os botões não fazem nada? (Clico em "Adicionar", "Limpar", mas nada acontece?)
  • As informações não são salvas/atualizadas/excluídas? (Mesmo que eu preencha os campos, os dados não persistem?)
  • O layout está bagunçado? (A aparência da tela não é como o esperado?)
  • Dá algum erro no console? (Aparece alguma mensagem de erro em vermelho quando você tenta executar?)

Com base no código que você compartilhou e nas minhas observações anteriores, posso apontar algumas coisas que "não funcionariam" como esperado por padrão ou que precisam de implementação:

  1. Botões de Rádio (Sexo):

    • Problema: jRadioButton1 ("Feminino") e jRadioButton2 ("Masculino") não estão agrupados por um ButtonGroup.
    • Resultado: O usuário pode selecionar ambos ao mesmo tempo, o que está incorreto para uma seleção de sexo.
    • Solução: Adicione um ButtonGroup no método initComponents() e adicione ambos os botões a ele.
      Java
      // Declarar na classe:
      private javax.swing.ButtonGroup buttonGroupSexo;
      
      // Dentro de initComponents():
      buttonGroupSexo = new javax.swing.ButtonGroup();
      buttonGroupSexo.add(jRadioButton1);
      buttonGroupSexo.add(jRadioButton2);
      
  2. Botões "Limpar" (exceto "Limpar Nome"):

    • Problema: Você tem vários botões "Limpar" (bnLimparBilhete, bnLimparDataNAsc, bnEmailLimpar, etc.), mas a maioria dos métodos actionPerformed associados a eles ainda contêm // TODO add your handling code here:. Apenas bnLimparNomeActionPerformed tem alguma lógica.
    • Resultado: Clicar nesses botões não fará nada.
    • Solução: Você precisa implementar a lógica para cada botão "Limpar" para apagar o texto do JTextField correspondente.
      • Exemplo para Limpar Bilhete (bnLimparBilhete):
        Java
        private void bnLimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
            jTextField3.setText(""); // Supondo que jTextField3 seja para Nº de Bilhete
        }
        
        Você precisará adicionar este método (se não existir) e vincular o bnLimparBilhete a ele (geralmente feito automaticamente pelo construtor de GUI se você arrastou e soltou o evento). Repita para todos os outros botões "Limpar".
  3. Botões "Adicionar", "Atualizar", "Excluir":

    • Problema: Os métodos btnAdicionarActionPerformed, btnAtualizarActionPerformed e btnExcluirActionPerformed (com exceção da validação de nome em btnAdicionar) não contêm nenhuma lógica para realmente manipular os dados (salvar em banco de dados, atualizar uma lista, etc.).
    • Resultado: Clicar nesses botões fará a validação inicial (no caso de "Adicionar"), mas não fará nada persistente com as informações do cliente.
    • Solução: Esta é a parte mais complexa e que requer a implementação da lógica de negócios e integração com um sistema de armazenamento (como um banco de dados ou um ArrayList em memória).
      • Para "Adicionar": Coletar todos os dados dos campos, criar um objeto Hospede (você precisaria criar essa classe), e então passar esse objeto para uma camada de persistência.
      • Para "Atualizar": Coletar os dados, encontrar o hóspede pelo ID (assumindo que jTextField8 é o ID), e atualizar os dados.
      • Para "Excluir": Obter o ID do jTextField8 e remover o hóspede correspondente.
  4. Botão "Voltar" (jButton9):

    • Problema: O método actionPerformed para este botão está vazio.
    • Resultado: Clicar em "Voltar" não fará nada.
    • Solução: Você precisa implementar a lógica para o que "Voltar" significa. Geralmente, isso envolve esconder a tela atual e mostrar uma tela anterior (por exemplo, um menu principal).
      Java
      private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {
          this.dispose(); // Fecha a tela atual
          // Se houver uma tela anterior para mostrar, você a instanciaria e a tornaria visível aqui
          // new TelaPrincipal().setVisible(true);
      }
      
  5. Caminho da Imagem do Logotipo:

    • Problema Potencial: Logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png")));
    • Resultado: Se a imagem não estiver no local correto dentro do seu projeto (na pasta src/main/resources/Imagem ou src/Imagem dependendo da estrutura do seu projeto), o logotipo não será exibido.
    • Verificação: Certifique-se de que o arquivo logo1-removebg-preview.png está na pasta Imagem dentro do seu diretório de recursos (geralmente src/main/resources ou diretamente src).

Por favor, me diga qual desses pontos ou qual outro comportamento inesperado você está enfrentando, para que eu possa te dar uma ajuda mais direcionada.

Com certeza! Para fazer as validações completas no seu formulário de cadastro de hóspedes em Java Swing, precisamos adicionar verificações para cada campo de entrada. Além disso, é uma boa prática agrupar os botões de rádio para o sexo e tratar os eventos de "limpar" para cada campo.

A SDK 52 que você mencionou não é diretamente relevante para o código Java Swing, pois é um termo mais comumente associado ao desenvolvimento Android ou a outras plataformas. No entanto, posso garantir que o código Java para validação funcionará perfeitamente com a sua configuração atual.

Aqui está o código TelaCadastro.java com as validações implementadas para cada campo, incluindo o uso de try-catch para campos numéricos e de data, e validação de e-mail e telefone. Também adicionei um ButtonGroup para os radio buttons de sexo e implementei os métodos actionPerformed para os botões de limpar.

Java
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
package telas;

import javax.swing.JOptionPane;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.ButtonGroup;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

/**
 *
 * @author mcdebug
 */
public class TelaCadastro extends javax.swing.JFrame {

    private static final Logger logger = Logger.getLogger(TelaCadastro.class.getName());
    private ButtonGroup sexoButtonGroup;

    /**
     * Creates new form TelaCadastro
     */
    public TelaCadastro() {
        initComponents();
        groupSexRadioButtons();
    }

    private void groupSexRadioButtons() {
        sexoButtonGroup = new ButtonGroup();
        sexoButtonGroup.add(jRadioButton1); // Feminino
        sexoButtonGroup.add(jRadioButton2); // Masculino
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalCadastro = new javax.swing.JPanel();
        txCadastroHóspedes = new javax.swing.JLabel();
        txNomeCompleto = new javax.swing.JLabel();
        txNºBilhete = new javax.swing.JLabel();
        txDataNasc = new javax.swing.JLabel();
        txTelefone = new javax.swing.JLabel();
        txEmail = new javax.swing.JLabel();
        txNacionalidade = new javax.swing.JLabel();
        txEndereco = new javax.swing.JLabel();
        lbSexo = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        // Renomeei os jTextFields para nomes mais significativos
        txtNomeCompleto = new javax.swing.JTextField();
        txtNumeroBilhete = new javax.swing.JTextField();
        txtDataNascimento = new javax.swing.JTextField();
        txtEmail = new javax.swing.JTextField();
        txtEndereco = new javax.swing.JTextField();
        txtTelefone = new javax.swing.JTextField();
        txtNacionalidade = new javax.swing.JTextField();
        jScrollPaneObservacoes = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnAdicionar = new javax.swing.JButton();
        btnAtualizar = new javax.swing.JButton();
        btnExcluir = new javax.swing.JButton();
        bnLimparNome = new javax.swing.JButton();
        bnLimparBilhete = new javax.swing.JButton();
        bnLimparDataNAsc = new javax.swing.JButton();
        bnEmailLimpar = new javax.swing.JButton();
        bnLimparEndereco = new javax.swing.JButton();
        bnsexoLimpar = new javax.swing.JButton();
        bnLimparTelefone = new javax.swing.JButton();
        bnLimparNacional = new javax.swing.JButton();
        txtID = new javax.swing.JTextField();
        txObservações = new javax.swing.JLabel();
        jButton9 = new javax.swing.JButton();
        Logo = new javax.swing.JLabel();
        txID = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Cadastro de Clientes/Hóspedes");
        setBackground(new java.awt.Color(255, 255, 255));
        setPreferredSize(new java.awt.Dimension(990, 1000));
        setResizable(false);

        jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
        jScrollPane1.setForeground(new java.awt.Color(255, 255, 255));
        jScrollPane1.setMaximumSize(new java.awt.Dimension(42767, 42767));

        painelPrincipalCadastro.setBackground(new java.awt.Color(255, 255, 255));

        txCadastroHóspedes.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        txCadastroHóspedes.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        txCadastroHóspedes.setText("Cadastro de Hóspedes");
        txCadastroHóspedes.setAlignmentX(0.5F);

        txNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNomeCompleto.setText("Nome Completo:");

        txNºBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNºBilhete.setText("Nº de Bilhete");

        txDataNasc.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txDataNasc.setText("Data Nasc.");

        txTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txTelefone.setText("Telefone");

        txEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txEmail.setText("Email");

        txNacionalidade.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txNacionalidade.setText("Nacionalidade");

        txEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txEndereco.setText("Endereço");

        lbSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lbSexo.setText("Sexo");

        jRadioButton1.setText("Feminino");
        jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton1ActionPerformed(evt);
            }
        });

        jRadioButton2.setText("Masculino");

        txtNomeCompleto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNomeCompletoActionPerformed(evt);
            }
        });

        txtNumeroBilhete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNumeroBilheteActionPerformed(evt);
            }
        });

        txtDataNascimento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataNascimentoActionPerformed(evt);
            }
        });

        txtObservacoes.setColumns(20);
        txtObservacoes.setLineWrap(true);
        txtObservacoes.setRows(5);
        txtObservacoes.setWrapStyleWord(true);
        jScrollPaneObservacoes.setViewportView(txtObservacoes);

        btnAdicionar.setText("Adicionar");
        btnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAdicionarActionPerformed(evt);
            }
        });

        btnAtualizar.setText("Atualizar");
        btnAtualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAtualizarActionPerformed(evt);
            }
        });

        btnExcluir.setText("Excluir");
        btnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExcluirActionPerformed(evt);
            }
        });

        bnLimparNome.setText("Limpar");
        bnLimparNome.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnLimparNomeActionPerformed(evt);
            }
        });

        bnLimparBilhete.setText("Limpar");
        bnLimparBilhete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnLimparBilheteActionPerformed(evt);
            }
        });

        bnLimparDataNAsc.setText("Limpar");
        bnLimparDataNAsc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnLimparDataNAscActionPerformed(evt);
            }
        });

        bnEmailLimpar.setText("Limpar");
        bnEmailLimpar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnEmailLimparActionPerformed(evt);
            }
        });

        bnLimparEndereco.setText("Limpar");
        bnLimparEndereco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnLimparEnderecoActionPerformed(evt);
            }
        });

        bnsexoLimpar.setText("Limpar");
        bnsexoLimpar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnsexoLimparActionPerformed(evt);
            }
        });

        bnLimparTelefone.setText("Limpar");
        bnLimparTelefone.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnLimparTelefoneActionPerformed(evt);
            }
        });

        bnLimparNacional.setText("Limpar");
        bnLimparNacional.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnLimparNacionalActionPerformed(evt);
            }
        });

        txObservações.setText("Observações");

        jButton9.setText("Voltar");

        Logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        txID.setFont(new java.awt.Font("Liberation Sans", 1, 18)); // NOI18N
        txID.setText("Id");

        jButton1.setText("Limpar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout painelPrincipalCadastroLayout = new javax.swing.GroupLayout(painelPrincipalCadastro);
        painelPrincipalCadastro.setLayout(painelPrincipalCadastroLayout);
        painelPrincipalCadastroLayout.setHorizontalGroup(
            painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createSequentialGroup()
                .addContainerGap(237, Short.MAX_VALUE)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txNºBilhete, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txDataNasc)
                            .addComponent(txEmail)
                            .addComponent(txEndereco)
                            .addComponent(txTelefone)
                            .addComponent(txNacionalidade)
                            .addComponent(lbSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 51, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(txNomeCompleto, javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                    .addComponent(btnAdicionar)
                                    .addGap(25, 25, 25))))
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                .addGap(18, 18, 18)
                                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                        .addComponent(jRadioButton2)
                                        .addGap(86, 86, 86)
                                        .addComponent(jRadioButton1)
                                        .addGap(128, 128, 128))
                                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                            .addComponent(txObservações)
                                            .addGap(27, 27, 27)
                                            .addComponent(jScrollPaneObservacoes, javax.swing.GroupLayout.PREFERRED_SIZE, 234, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, painelPrincipalCadastroLayout.createSequentialGroup()
                                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                                .addComponent(txtTelefone, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtEndereco, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtEmail, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtDataNascimento, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtNumeroBilhete, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtNomeCompleto, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtID, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtNacionalidade, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE))
                                            .addGap(27, 27, 27)
                                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(bnLimparNome)
                                                .addComponent(jButton1)
                                                .addComponent(bnLimparBilhete)
                                                .addComponent(bnLimparDataNAsc)
                                                .addComponent(bnEmailLimpar)
                                                .addComponent(bnLimparEndereco)
                                                .addComponent(bnsexoLimpar)
                                                .addComponent(bnLimparTelefone)
                                                .addComponent(bnLimparNacional))))))
                            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                .addGap(95, 95, 95)
                                .addComponent(btnAtualizar, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(409, 409, 409))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addComponent(txID, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(263, 263, 263))))
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGap(296, 296, 296)
                .addComponent(txCadastroHóspedes, javax.swing.GroupLayout.PREFERRED_SIZE, 447, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGap(275, 275, 275)
                .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 381, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(181, 181, 181))
        );
        painelPrincipalCadastroLayout.setVerticalGroup(
            painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(168, 168, 168)
                        .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txCadastroHóspedes)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 42, Short.MAX_VALUE)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(txID, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButton1)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtNomeCompleto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(bnLimparNome))
                    .addComponent(txNomeCompleto))
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(30, 30, 30)
                        .addComponent(bnLimparBilhete))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtNumeroBilhete, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txNºBilhete))))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtDataNascimento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(bnLimparDataNAsc))
                    .addComponent(txDataNasc))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txEmail)
                    .addComponent(txtEmail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnEmailLimpar))
                .addGap(30, 30, 30)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtEndereco, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txEndereco)
                    .addComponent(bnLimparEndereco))
                .addGap(24, 24, 24)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtTelefone, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnsexoLimpar)
                    .addComponent(txTelefone))
                .addGap(33, 33, 33)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtNacionalidade, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnLimparTelefone)
                    .addComponent(txNacionalidade))
                .addGap(21, 21, 21)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bnLimparNacional)
                    .addComponent(jRadioButton2)
                    .addComponent(jRadioButton1)
                    .addComponent(lbSexo))
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(45, 45, 45)
                        .addComponent(txObservações))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPaneObservacoes, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(24, 24, 24)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnAtualizar)
                    .addComponent(btnExcluir)
                    .addComponent(btnAdicionar))
                .

Com certeza! Vamos implementar todas as validações e funcionalidades de "Limpar" e "Voltar" na sua TelaCadastro.java.

Para fazer isso de forma organizada, vou:

  1. Renomear os JTextField para nomes mais claros (txtNomeCompleto, txtNumeroBilhete, etc.) para que o código fique mais fácil de entender e manter. Você precisará aplicar essas renomeações no NetBeans no modo Design (clique com o botão direito no campo -> Change Variable Name) para que o initComponents() seja atualizado automaticamente.
  2. Agrupar os botões de rádio de sexo usando um ButtonGroup.
  3. Implementar a lógica para todos os botões "Limpar".
  4. Implementar a lógica para o botão "Voltar" (jButton9).
  5. Adicionar validações detalhadas no método btnAdicionarActionPerformed para todos os campos relevantes.

Aqui está o código completo e atualizado para a sua TelaCadastro.java:

Java
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
package telas;

import javax.swing.JOptionPane;
import javax.swing.ButtonGroup; // Importe ButtonGroup
import java.util.logging.Level;
import java.util.logging.Logger;
import java.time.LocalDate; // Para validação de data
import java.time.format.DateTimeFormatter; // Para formatação/parsing de data
import java.time.format.DateTimeParseException; // Para capturar erros de data
import java.util.regex.Matcher; // Para validação de email
import java.util.regex.Pattern; // Para validação de email

/**
 *
 * @author mcdebug
 */
public class TelaCadastro extends javax.swing.JFrame {

    private static final Logger logger = Logger.getLogger(TelaCadastro.class.getName());
    private ButtonGroup sexoButtonGroup; // Declaração do ButtonGroup

    /**
     * Creates new form TelaCadastro
     */
    public TelaCadastro() {
        initComponents();
        setLocationRelativeTo(null); // Centraliza a tela
        groupSexRadioButtons(); // Chama o método para agrupar os botões de rádio
        addListenersManually(); // Adiciona listeners para os botões que não foram gerados automaticamente
    }

    // Método para agrupar os botões de rádio de sexo
    private void groupSexRadioButtons() {
        sexoButtonGroup = new ButtonGroup();
        sexoButtonGroup.add(jRadioButton1); // JRadioButton1 para Feminino
        sexoButtonGroup.add(jRadioButton2); // JRadioButton2 para Masculino
    }

    // Método para adicionar listeners manualmente a botões que não são do editor de formulários
    private void addListenersManually() {
        // Listener para o botão Voltar
        jButton9.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton9ActionPerformed(evt);
            }
        });

        // Listeners para os botões Limpar (se não foram gerados automaticamente com actionPerformed)
        bnLimparBilhete.addActionListener(this::bnLimparBilheteActionPerformed);
        bnLimparDataNAsc.addActionListener(this::bnLimparDataNAscActionPerformed);
        bnEmailLimpar.addActionListener(this::bnEmailLimparActionPerformed);
        bnLimparEndereco.addActionListener(this::bnLimparEnderecoActionPerformed);
        bnsexoLimpar.addActionListener(this::bnsexoLimparActionPerformed);
        bnLimparTelefone.addActionListener(this::bnLimparTelefoneActionPerformed);
        bnLimparNacional.addActionListener(this::bnLimparNacionalActionPerformed);
        // jButton1 é o Limpar para o ID
        jButton1.addActionListener(this::jButton1ActionPerformed);
    }


    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalCadastro = new javax.swing.JPanel();
        txCadastroHóspedes = new javax.swing.JLabel();
        txNomeCompleto = new javax.swing.JLabel();
        txNºBilhete = new javax.swing.JLabel();
        txDataNasc = new javax.swing.JLabel();
        txTelefone = new javax.swing.JLabel();
        txEmail = new javax.swing.JLabel();
        txNacionalidade = new javax.swing.JLabel();
        txEndereco = new javax.swing.JLabel();
        lbSexo = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        // Renomeei as variáveis de JTextField para refletir os campos
        txtID = new javax.swing.JTextField(); // Antigo jTextField8
        txtNomeCompleto = new javax.swing.JTextField(); // Antigo jTextField2
        txtNumeroBilhete = new javax.swing.JTextField(); // Antigo jTextField3
        txtDataNascimento = new javax.swing.JTextField(); // Antigo jTextField1
        txtEmail = new javax.swing.JTextField(); // Antigo jTextField4
        txtEndereco = new javax.swing.JTextField(); // Antigo jTextField5
        txtTelefone = new javax.swing.JTextField(); // Antigo jTextField6
        txtNacionalidade = new javax.swing.JTextField(); // Antigo jTextField11

        jScrollPaneObservacoes = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnAdicionar = new javax.swing.JButton();
        btnAtualizar = new javax.swing.JButton();
        btnExcluir = new javax.swing.JButton();
        bnLimparNome = new javax.swing.JButton();
        bnLimparBilhete = new javax.swing.JButton();
        bnLimparDataNAsc = new javax.swing.JButton();
        bnEmailLimpar = new javax.swing.JButton();
        bnLimparEndereco = new javax.swing.JButton();
        bnsexoLimpar = new javax.swing.JButton();
        bnLimparTelefone = new javax.swing.JButton();
        bnLimparNacional = new javax.swing.JButton();
        txObservações = new javax.swing.JLabel();
        jButton9 = new javax.swing.JButton(); // Botão Voltar
        Logo = new javax.swing.JLabel();
        txID = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton(); // Botão Limpar ID

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Cadastro de Clientes/Hóspedes");
        setBackground(new java.awt.Color(255, 255, 255));
        setPreferredSize(new java.awt.Dimension(990, 1000));
        setResizable(false);

        jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
        jScrollPane1.setForeground(new java.awt.Color(255, 255, 255));
        jScrollPane1.setMaximumSize(new java.awt.Dimension(42767, 42767));

        painelPrincipalCadastro.setBackground(new java.awt.Color(255, 255, 255));

        txCadastroHóspedes.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        txCadastroHóspedes.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        txCadastroHóspedes.setText("Cadastro de Hóspedes");
        txCadastroHóspedes.setAlignmentX(0.5F);

        txNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNomeCompleto.setText("Nome Completo:");

        txNºBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNºBilhete.setText("Nº de Bilhete");

        txDataNasc.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txDataNasc.setText("Data Nasc.");

        txTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txTelefone.setText("Telefone");

        txEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txEmail.setText("Email");

        txNacionalidade.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txNacionalidade.setText("Nacionalidade");

        txEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txEndereco.setText("Endereço");

        lbSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lbSexo.setText("Sexo");

        jRadioButton1.setText("Feminino");
        // O listener para jRadioButton1 já está aqui, vamos manter e garantir que o dispose() seja removido.
        jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton1ActionPerformed(evt);
            }
        });

        jRadioButton2.setText("Masculino");
        // Adicionar o listener para o jRadioButton2 também, se não for feito pelo designer
        jRadioButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton2ActionPerformed(evt);
            }
        });


        // Atualiza os ActionListeners para usar as novas variáveis
        txtNomeCompleto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNomeCompletoActionPerformed(evt);
            }
        });

        txtNumeroBilhete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNumeroBilheteActionPerformed(evt);
            }
        });

        txtDataNascimento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataNascimentoActionPerformed(evt);
            }
        });
        
        // Listeners para os outros campos (opcional, se você quiser ações ao pressionar Enter)
        txtEmail.addActionListener(e -> txtEmailActionPerformed(e));
        txtEndereco.addActionListener(e -> txtEnderecoActionPerformed(e));
        txtTelefone.addActionListener(e -> txtTelefoneActionPerformed(e));
        txtNacionalidade.addActionListener(e -> txtNacionalidadeActionPerformed(e));
        txtID.addActionListener(e -> txtIDActionPerformed(e));


        txtObservacoes.setColumns(20);
        txtObservacoes.setLineWrap(true);
        txtObservacoes.setRows(5);
        txtObservacoes.setWrapStyleWord(true);
        jScrollPaneObservacoes.setViewportView(txtObservacoes);

        btnAdicionar.setText("Adicionar");
        btnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAdicionarActionPerformed(evt);
            }
        });

        btnAtualizar.setText("Atualizar");
        btnAtualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAtualizarActionPerformed(evt);
            }
        });

        btnExcluir.setText("Excluir");
        btnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExcluirActionPerformed(evt);
            }
        });

        bnLimparNome.setText("Limpar");
        // Listener já será adicionado via addListenersManually() ou pelo designer
        // bnLimparNome.addActionListener(this::bnLimparNomeActionPerformed); // Mantido por consistência

        bnLimparBilhete.setText("Limpar");
        // bnLimparBilhete.addActionListener(this::bnLimparBilheteActionPerformed); // Mantido por consistência

        bnLimparDataNAsc.setText("Limpar");
        // bnLimparDataNAsc.addActionListener(this::bnLimparDataNAscActionPerformed); // Mantido por consistência

        bnEmailLimpar.setText("Limpar");
        // bnEmailLimpar.addActionListener(this::bnEmailLimparActionPerformed); // Mantido por consistência

        bnLimparEndereco.setText("Limpar");
        // bnLimparEndereco.addActionListener(this::bnLimparEnderecoActionPerformed); // Mantido por consistência

        bnsexoLimpar.setText("Limpar");
        // bnsexoLimpar.addActionListener(this::bnsexoLimparActionPerformed); // Mantido por consistência

        bnLimparTelefone.setText("Limpar");
        // bnLimparTelefone.addActionListener(this::bnLimparTelefoneActionPerformed); // Mantido por consistência

        bnLimparNacional.setText("Limpar");
        // bnLimparNacional.addActionListener(this::bnLimparNacionalActionPerformed); // Mantido por consistência

        txObservações.setText("Observações");

        jButton9.setText("Voltar");
        // jButton9.addActionListener(this::jButton9ActionPerformed); // Mantido por consistência

        Logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        txID.setFont(new java.awt.Font("Liberation Sans", 1, 18)); // NOI18N
        txID.setText("Id");

        jButton1.setText("Limpar");
        // jButton1.addActionListener(this::jButton1ActionPerformed); // Mantido por consistência

        javax.swing.GroupLayout painelPrincipalCadastroLayout = new javax.swing.GroupLayout(painelPrincipalCadastro);
        painelPrincipalCadastro.setLayout(painelPrincipalCadastroLayout);
        painelPrincipalCadastroLayout.setHorizontalGroup(
            painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createSequentialGroup()
                .addContainerGap(237, Short.MAX_VALUE)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txNºBilhete, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txDataNasc)
                            .addComponent(txEmail)
                            .addComponent(txEndereco)
                            .addComponent(txTelefone)
                            .addComponent(txNacionalidade)
                            .addComponent(lbSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 51, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(txNomeCompleto, javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                    .addComponent(btnAdicionar)
                                    .addGap(25, 25, 25))))
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                .addGap(18, 18, 18)
                                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                        .addComponent(jRadioButton2)
                                        .addGap(86, 86, 86)
                                        .addComponent(jRadioButton1)
                                        .addGap(128, 128, 128))
                                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                            .addComponent(txObservações)
                                            .addGap(27, 27, 27)
                                            .addComponent(jScrollPaneObservacoes, javax.swing.GroupLayout.PREFERRED_SIZE, 234, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, painelPrincipalCadastroLayout.createSequentialGroup()
                                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                                .addComponent(txtTelefone, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtEndereco, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtEmail, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtDataNascimento, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtNumeroBilhete, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtNomeCompleto, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtID, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(txtNacionalidade, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE))
                                            .addGap(27, 27, 27)
                                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(bnLimparNome)
                                                .addComponent(jButton1)
                                                .addComponent(bnLimparBilhete)
                                                .addComponent(bnLimparDataNAsc)
                                                .addComponent(bnEmailLimpar)
                                                .addComponent(bnLimparEndereco)
                                                .addComponent(bnsexoLimpar)
                                                .addComponent(bnLimparTelefone)
                                                .addComponent(bnLimparNacional))))))
                            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                .addGap(95, 95, 95)
                                .addComponent(btnAtualizar, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(409, 409, 409))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addComponent(txID, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(263, 263, 263))))
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGap(296, 296, 296)
                .addComponent(txCadastroHóspedes, javax.swing.GroupLayout.PREFERRED_SIZE, 447, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGap(275, 275, 275)
                .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 381, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(181, 181, 181))
        );
        painelPrincipalCadastroLayout.setVerticalGroup(
            painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(168, 168, 168)
                        .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txCadastroHóspedes)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 42, Short.MAX_VALUE)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(txID, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButton1)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtNomeCompleto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(bnLimparNome))
                    .addComponent(txNomeCompleto))
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(30, 30, 30)
                        .addComponent(bnLimparBilhete))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtNumeroBilhete, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txNºBilhete))))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtDataNascimento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(bnLimparDataNAsc))
                    .addComponent(txDataNasc))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txEmail)
                    .addComponent(txtEmail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnEmailLimpar))
                .addGap(30, 30, 30)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtEndereco, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txEndereco)
                    .addComponent(bnLimparEndereco))
                .addGap(24, 24, 24)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtTelefone, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnsexoLimpar)
                    .addComponent(txTelefone))
                .addGap(33, 33, 33)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtNacionalidade, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnLimparTelefone)
                    .addComponent(txNacionalidade))
                .addGap(21, 21, 21)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bnLimparNacional)
                    .addComponent(jRadioButton2)
                    .addComponent(jRadioButton1)
                    .addComponent(lbSexo))
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(45, 45, 45)
                        .addComponent(txObservações))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPaneObservacoes, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(24, 24, 24)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnAtualizar)
                    .addComponent(btnExcluir)
                    .addComponent(btnAdicionar))
                .addContainerGap(654, Short.MAX_VALUE))
        );

        jScrollPane1.setViewportView(painelPrincipalCadastro);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1085, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 962, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(19, 19, 19))
        );

        pack();
    }// </editor-fold>                        

    // --- MÉTODOS DE AÇÃO E VALIDAÇÃO ---

    private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {                                             
        String id = txtID.getText().trim();
        String nomeCompleto = txtNomeCompleto.getText().trim();
        String numeroBilhete = txtNumeroBilhete.getText().trim();
        String dataNascimentoStr = txtDataNascimento.getText().trim();
        String telefone = txtTelefone.getText().trim();
        String email = txtEmail.getText().trim();
        String endereco = txtEndereco.getText().trim();
        String nacionalidade = txtNacionalidade.getText().trim();
        String sexo = "";
        String observacoes = txtObservacoes.getText().trim();

        // 1. Validação de campos obrigatórios
        if (id.isEmpty() || nomeCompleto.isEmpty() || numeroBilhete.isEmpty() ||
            dataNascimentoStr.isEmpty() || telefone.isEmpty() || email.isEmpty() ||
            endereco.isEmpty() || nacionalidade.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Por favor, preencha todos os campos obrigatórios.", "Campos Vazios", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 2. Validação de Sexo (radio buttons)
        if (!jRadioButton1.isSelected() && !jRadioButton2.isSelected()) {
            JOptionPane.showMessageDialog(this, "Por favor, selecione o sexo do hóspede.", "Campo Obrigatório", JOptionPane.WARNING_MESSAGE);
            return;
        } else {
            if (jRadioButton1.isSelected()) {
                sexo = "Feminino";
            } else if (jRadioButton2.isSelected()) {
                sexo = "Masculino";
            }
        }

        // 3. Validação de Email (formato básico)
        String emailRegex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
        Pattern emailPattern = Pattern.compile(emailRegex);
        Matcher emailMatcher = emailPattern.matcher(email);
        if (!emailMatcher.matches()) {
            JOptionPane.showMessageDialog(this, "O email inserido não é válido.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 4. Validação de Telefone (apenas números, pode ser aprimorado para DDD, etc.)
        if (!telefone.matches("\\d+")) { // Verifica se contém apenas dígitos
            JOptionPane.showMessageDialog(this, "O telefone deve conter apenas números.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 5. Validação de Data de Nascimento (formato dd/MM/yyyy)
        LocalDate dataNascimento = null;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        try {
            dataNascimento = LocalDate.parse(dataNascimentoStr, formatter);
            // Opcional: Validar se a data não é futura
            if (dataNascimento.isAfter(LocalDate.now())) {
                JOptionPane.showMessageDialog(this, "A data de nascimento não pode ser futura.", "Data Inválida", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use dd/MM/yyyy.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            logger.log(Level.WARNING, "Erro de parsing de data de nascimento: " + dataNascimentoStr, e);
            return;
        }
        
        // Se todas as validações passaram
        JOptionPane.showMessageDialog(this, "Hóspede adicionado com sucesso!\n" +
                                       "ID: " + id + "\n" +
                                       "Nome: " + nomeCompleto + "\n" +
                                       "Bilhete: " + numeroBilhete + "\n" +
                                       "Data Nasc.: " + dataNascimentoStr + "\n" +
                                       "Telefone: " + telefone + "\n" +
                                       "Email: " + email + "\n" +
                                       "Endereço: " + endereco + "\n" +
                                       "Nacionalidade: " + nacionalidade + "\n" +
                                       "Sexo: " + sexo + "\n" +
                                       "Observações: " + observacoes,
                                       "Sucesso", JOptionPane.INFORMATION_MESSAGE);

        logger.log(Level.INFO, "Hóspede adicionado: {0}", nomeCompleto);
        limparTodosOsCampos(); // Chama o método para limpar todos os campos após sucesso
    }                                            

    private void btnExcluirActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // Lógica de exclusão:
        // 1. Obter o ID ou outro identificador para exclusão (ex: txtID.getText())
        String idParaExcluir = txtID.getText().trim();
        if (idParaExcluir.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Por favor, insira o ID do hóspede a ser excluído.", "Campo Obrigatório", JOptionPane.WARNING_MESSAGE);
            return;
        }

        int confirm = JOptionPane.showConfirmDialog(this, "Tem certeza que deseja excluir o hóspede com ID: " + idParaExcluir + "?", "Confirmar Exclusão", JOptionPane.YES_NO_OPTION);
        if (confirm == JOptionPane.YES_OPTION) {
            // Implemente sua lógica de banco de dados ou lista para excluir o hóspede
            // Exemplo fictício:
            // boolean excluidoComSucesso = suaClasseDeDados.excluirHospede(idParaExcluir);
            // if (excluidoComSucesso) {
                 JOptionPane.showMessageDialog(this, "Hóspede com ID " + idParaExcluir + " excluído com sucesso!", "Exclusão Realizada", JOptionPane.INFORMATION_MESSAGE);
                 logger.log(Level.INFO, "Hóspede excluído: ID {0}", idParaExcluir);
                 limparTodosOsCampos(); // Limpa os campos após exclusão
            // } else {
            //     JOptionPane.showMessageDialog(this, "Erro ao excluir hóspede. ID não encontrado ou problema no sistema.", "Erro", JOptionPane.ERROR_MESSAGE);
            //     logger.log(Level.SEVERE, "Falha ao excluir hóspede: ID {0}", idParaExcluir);
            // }
        }
    }                                          

    private void btnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {                                             
        // Lógica de atualização:
        // 1. Obter todos os dados dos campos
        String id = txtID.getText().trim();
        String nomeCompleto = txtNomeCompleto.getText().trim();
        String numeroBilhete = txtNumeroBilhete.getText().trim();
        String dataNascimentoStr = txtDataNascimento.getText().trim();
        String telefone = txtTelefone.getText().trim();
        String email = txtEmail.getText().trim();
        String endereco = txtEndereco.getText().trim();
        String nacionalidade = txtNacionalidade.getText().trim();
        String sexo = "";
        String observacoes = txtObservacoes.getText().trim();

        // 2. Validação básica (pelo menos o ID e nome devem estar preenchidos para atualizar)
        if (id.isEmpty() || nomeCompleto.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Para atualizar, o ID e o Nome Completo são obrigatórios.", "Campos Obrigatórios", JOptionPane.WARNING_MESSAGE);
            return;
        }
        
        // As mesmas validações de "Adicionar" podem ser aplicadas aqui para garantir a integridade dos novos dados
        // (validação de sexo, email, telefone, data)
        if (!jRadioButton1.isSelected() && !jRadioButton2.isSelected()) {
            JOptionPane.showMessageDialog(this, "Por favor, selecione o sexo do hóspede.", "Campo Obrigatório", JOptionPane.WARNING_MESSAGE);
            return;
        } else {
            if (jRadioButton1.isSelected()) {
                sexo = "Feminino";
            } else if (jRadioButton2.isSelected()) {
                sexo = "Masculino";
            }
        }
        
        String emailRegex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
        Pattern emailPattern = Pattern.compile(emailRegex);
        Matcher emailMatcher = emailPattern.matcher(email);
        if (!emailMatcher.matches()) {
            JOptionPane.showMessageDialog(this, "O email inserido não é válido.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            return;
        }
        
        if (!telefone.matches("\\d+")) {
            JOptionPane.showMessageDialog(this, "O telefone deve conter apenas números.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            return;
        }
        
        LocalDate dataNascimento = null;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        try {
            dataNascimento = LocalDate.parse(dataNascimentoStr, formatter);
            if (dataNascimento.isAfter(LocalDate.now())) {
                JOptionPane.showMessageDialog(this, "A data de nascimento não pode ser futura.", "Data Inválida", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use dd/MM/yyyy.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            logger.log(Level.WARNING, "Erro de parsing de data de nascimento para atualização: " + dataNascimentoStr, e);
            return;
        }

        // Implemente sua lógica de banco de dados ou lista para atualizar o hóspede
        // Exemplo fictício:
        // Hospede hospedeAtualizado = new Hospede(id, nomeCompleto, numeroBilhete, dataNascimento, telefone, email, endereco, nacionalidade, sexo, observacoes);
        // boolean atualizadoComSucesso = suaClasseDeDados.atualizarHospede(hospedeAtualizado);
        // if (atualizadoComSucesso) {
             JOptionPane.showMessageDialog(this, "Hóspede com ID " + id + " atualizado com sucesso!", "Atualização Realizada", JOptionPane.INFORMATION_MESSAGE);
             logger.log(Level.INFO, "Hóspede atualizado: ID {0}", id);
             limparTodosOsCampos(); // Limpa os campos após atualização
        // } else {
        //     JOptionPane.showMessageDialog(this, "Erro ao atualizar hóspede. ID não encontrado ou problema no sistema.", "Erro", JOptionPane.ERROR_MESSAGE);
        //     logger.log(Level.SEVERE, "Falha ao atualizar hóspede: ID {0}", id);
        // }
    }                                            

    // Métodos para limpar campos individuais (actionPerformed)
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // Limpa ID
        txtID.setText("");
    }

    private void bnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        txtNomeCompleto.setText("");
    }

    private void bnLimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        txtNumeroBilhete.setText("");
    }

    private void bnLimparDataNAscActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataNascimento.setText("");
    }

    private void bnEmailLimparActionPerformed(java.awt.event.ActionEvent evt) {
        txtEmail.setText("");
    }

    private void bnLimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
        txtEndereco.setText("");
    }

    private void bnsexoLimparActionPerformed(java.awt.event.ActionEvent evt) {
        sexoButtonGroup.clearSelection(); // Limpa a seleção dos radio buttons
    }

    private void bnLimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) {
        txtTelefone.setText("");
    }

    private void bnLimparNacionalActionPerformed(java.awt.event.ActionEvent evt) {
        txtNacionalidade.setText("");
    }

    // Método para limpar todos os campos
    private void limparTodosOsCampos() {
        txtID.setText("");
        txtNomeCompleto.setText("");
        txtNumeroBilhete.setText("");
        txtDataNascimento.setText("");
        txtEmail.setText("");
        txtEndereco.setText("");
        txtTelefone.setText("");
        txtNacionalidade.setText("");
        sexoButtonGroup.clearSelection(); // Limpa a seleção do sexo
        txtObservacoes.setText("");
    }

    // Método de ação para o botão Voltar
    private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // Cria uma nova instância da TelaHome
        TelaHome telaHome = new TelaHome();
        // Torna a TelaHome visível
        telaHome.setVisible(true);
        // Fecha a tela atual (TelaCadastro)
        this.dispose();
    }                                        

    // Métodos de ação para os JTextFields (apenas stubs, se não houver lógica específica ao pressionar Enter)
    private void txtNomeCompletoActionPerformed(java.awt.event.ActionEvent evt) {}                                                
    private void txtNumeroBilheteActionPerformed(java.awt.event.ActionEvent evt) {}                                                 
    private void txtDataNascimentoActionPerformed(java.awt.event.ActionEvent evt) {}                                                  
    private void txtEmailActionPerformed(java.awt.event.ActionEvent evt) {}                                         
    private void txtEnderecoActionPerformed(java.awt.event.ActionEvent evt) {}                                          
    private void txtTelefoneActionPerformed(java.awt.event.ActionEvent evt) {}                                          
    private void txtNacionalidadeActionPerformed(java.awt.event.ActionEvent evt) {}                                                
    private void txtIDActionPerformed(java.awt.event.ActionEvent evt) {}                                      
    private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // Não precisamos de lógica aqui além da que o ButtonGroup já faz.
        // O this.dispose() que estava antes aqui foi removido, pois era um erro.
    }                                           
    private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        // Não precisamos de lógica aqui além da que o ButtonGroup já faz.
    }                                           

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ReflectiveOperationException | javax.swing.UnsupportedLookAndFeelException ex) {
            logger.log(Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(() -> new TelaCadastro().setVisible(true));
    }

    // --- VARIÁVEIS DO FORMULÁRIO ---
    // NOTA: Estes nomes de variáveis são os que você DEVE RENOMEAR no seu NetBeans Design View
    // Se você não os renomear, o código initComponents() ainda usará os nomes antigos (jTextField1, etc.)
    // e haverá um erro de compilação.
    private javax.swing.JLabel Logo;
    private javax.swing.JButton bnEmailLimpar;
    private javax.swing.JButton bnLimparBilhete;
    private javax.swing.JButton bnLimparDataNAsc;
    private javax.swing.JButton bnLimparEndereco;
    private javax.swing.JButton bnLimparNacional;
    private javax.swing.JButton bnLimparNome;
    private javax.swing.JButton bnLimparTelefone;
    private javax.swing.JButton bnsexoLimpar;
    private javax.swing.JButton btnAdicionar;
    private javax.swing.JButton btnAtualizar;
    private javax.swing.JButton btnExcluir;
    private javax.swing.JButton jButton1; // Botão Limpar ID
    private javax.swing.JButton jButton9; // Botão Voltar
    private javax.swing.JRadioButton jRadioButton1; // Botão de rádio Feminino
    private javax.swing.JRadioButton jRadioButton2; // Botão de rádio Masculino
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPaneObservacoes;

    // Campos de texto renomeados para clareza
    private javax.swing.JTextField txtID;             // Antigo jTextField8
    private javax.swing.JTextField txtNomeCompleto;   // Antigo jTextField2
    private javax.swing.JTextField txtNumeroBilhete;  // Antigo jTextField3
    private javax.swing.JTextField txtDataNascimento; // Antigo jTextField1
    private javax.swing.JTextField txtEmail;          // Antigo jTextField4
    private javax.swing.JTextField txtEndereco;       // Antigo jTextField5
    private javax.swing.JTextField txtTelefone;       // Antigo jTextField6
    private javax.swing.JTextField txtNacionalidade;  // Antigo jTextField11


    private javax.swing.JLabel lbSexo;
    private javax.swing.JPanel painelPrincipalCadastro;
    private javax.swing.JLabel txCadastroHóspedes;
    private javax.swing.JLabel txDataNasc;
    private javax.swing.JLabel txEmail;
    private javax.swing.JLabel txEndereco;
    private javax.swing.JLabel txID;
    private javax.swing.JLabel txNacionalidade;
    private javax.swing.JLabel txNomeCompleto;
    private javax.swing.JLabel txNºBilhete;
    private javax.swing.JLabel txObservações;
    private javax.swing.JLabel txTelefone;
    private javax.swing.JTextArea txtObservacoes;
    // End of variables declaration                   
}

Passos CRUCIAIS para você:

  1. Renomear Variáveis no NetBeans: No seu ambiente de desenvolvimento (NetBeans), abra a TelaCadastro.java no modo "Design". Para cada JTextField que atualmente tem um nome genérico (como jTextField1, jTextField2, etc.), clique com o botão direito sobre ele, selecione "Change Variable Name..." e mude para os nomes que usei no código (ex: jTextField8 para txtID, jTextField2 para txtNomeCompleto, jTextField3 para txtNumeroBilhete, jTextField1 para txtDataNascimento, jTextField4 para txtEmail, jTextField5 para txtEndereco, jTextField6 para txtTelefone, jTextField11 para txtNacionalidade). Isso é fundamental para que o initComponents() gerado corresponda ao código manual.

  2. Verificar e Adicionar jRadioButton2ActionPerformed: O seu código original tinha um jRadioButton1ActionPerformed. Eu adicionei um jRadioButton2ActionPerformed (que também não precisa de lógica complexa, apenas para ele existir). Certifique-se de que ambos os JRadioButtons tenham um listener atribuído no designer do NetBeans ou que a linha jRadioButton2.addActionListener(this::jRadioButton2ActionPerformed); esteja presente no initComponents() ou no construtor.

  3. Remova this.dispose(); de jRadioButton1ActionPerformed: No seu código anterior, o método jRadioButton1ActionPerformed tinha this.dispose();. Isso faria a tela fechar ao selecionar o rádio botão feminino, o que é um comportamento inesperado. Eu removi essa linha no código acima.

  4. Teste as validações: Execute a aplicação e tente adicionar um hóspede com campos vazios, e-mail inválido, telefone não numérico, data de nascimento futura ou inválida, e sem selecionar o sexo. Você deverá ver as mensagens de erro correspondentes.

  5. Teste os botões "Limpar" e "Voltar": Verifique se todos os botões "Limpar" esvaziam seus respectivos campos e se o botão "Voltar" (jButton9) fecha a TelaCadastro e abre a TelaHome.

Com essas alterações e verificações, sua TelaCadastro deve estar muito mais robusta e funcional!

O código que você compartilhou está no caminho certo para criar uma tela de cadastro de hóspedes em Java Swing, mas contém alguns pequenos erros e pontos que podem ser melhorados para garantir seu funcionamento e boas práticas.

Vamos revisar e corrigir o código, comentando as alterações:

Java
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
package telas;

import javax.swing.JOptionPane;
import java.util.logging.Logger;
import java.util.logging.Level; // Importar Level para usar logger.log(Level.WARNING, ...)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.ButtonGroup;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;


public class TelaCadastro extends javax.swing.JFrame {
    
    private static final Logger logger = Logger.getLogger(TelaCadastro.class.getName());
    private ButtonGroup sexoButtonGroup;

    // Declaração dos JTextFields e JTextAreas
    // OBS: Os nomes das variáveis aqui devem corresponder aos nomes que você usou
    // no método initComponents() para os componentes.
    // Pelo seu código initComponents, parece que você está usando jTextField1, jTextField2, etc.
    // e não txtID, txtNomeCompleto, etc. como nos métodos actionPerformed.
    // VOU ASSUMIR OS NOMES "txtNomeDoCampo" PARA OS CAMPOS DE TEXTO E RADIO BUTTONS
    // E VOCÊ DEVERÁ MUDÁ-LOS NO initComponents() OU AQUI PARA CORRESPONDER.

    private javax.swing.JTextField txtID; // Corresponde a jTextField8 no initComponents
    private javax.swing.JTextField txtNomeCompleto; // Corresponde a jTextField2 no initComponents
    private javax.swing.JTextField txtNumeroBilhete; // Corresponde a jTextField3 no initComponents
    private javax.swing.JTextField txtDataNascimento; // Corresponde a jTextField1 no initComponents
    private javax.swing.JTextField txtTelefone; // Corresponde a jTextField6 no initComponents
    private javax.swing.JTextField txtEmail; // Corresponde a jTextField4 no initComponents
    private javax.swing.JTextField txtEndereco; // Corresponde a jTextField5 no initComponents
    private javax.swing.JTextField txtNacionalidade; // Corresponde a jTextField11 no initComponents
    private javax.swing.JTextArea txtObservacoes; // Este já está correto no initComponents
    private javax.swing.JRadioButton jRadioButton1; // Feminino
    private javax.swing.JRadioButton jRadioButton2; // Masculino

    // Botões
    private javax.swing.JButton bnLimparBilhete;
    private javax.swing.JButton bnLimparDataNAsc;
    private javax.swing.JButton bnEmailLimpar;
    private javax.swing.JButton bnLimparEndereco;
    private javax.swing.JButton bnsexoLimpar;
    private javax.swing.JButton bnLimparTelefone;
    private javax.swing.JButton bnLimparNacional;
    private javax.swing.JButton jButton1; // Botão Limpar para o ID
    private javax.swing.JButton jButton9; // Botão Voltar
    private javax.swing.JButton bnLimparNome; // Adicionado para consistência, embora não estivesse no addListenersManually
    private javax.swing.JButton btnAdicionar;
    private javax.swing.JButton btnAtualizar;
    private javax.swing.JButton btnExcluir;


    // Outros componentes da UI (JLabels, JScrollPanes, JPanels)
    private javax.swing.JLabel Logo;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPaneObservacoes;
    private javax.swing.JPanel painelPrincipalCadastro;
    private javax.swing.JLabel txCadastroHóspedes;
    private javax.swing.JLabel txDataNasc;
    private javax.swing.JLabel txEmail;
    private javax.swing.JLabel txEndereco;
    private javax.swing.JLabel txID;
    private javax.swing.JLabel lbSexo;
    private javax.swing.JLabel txNacionalidade;
    private javax.swing.JLabel txNomeCompleto;
    private javax.swing.JLabel txNºBilhete;
    private javax.swing.JLabel txObservações;
    private javax.swing.JLabel txTelefone;


    /**
     * Creates new form TelaCadastro
     */
    public TelaCadastro() {
        initComponents();
        groupSexRadioButtons();
        addListenersManually(); // Chamar este método no construtor
    }

    private void groupSexRadioButtons() {
        sexoButtonGroup = new ButtonGroup();
        sexoButtonGroup.add(jRadioButton1); // Feminino
        sexoButtonGroup.add(jRadioButton2); // Masculino
    }

    // Método para adicionar listeners manualmente.
    // É uma boa prática ter todos os listeners configurados aqui ou diretamente no initComponents.
    // O NetBeans geralmente gera os listeners diretamente no initComponents, mas se você os moveu,
    // este método é o lugar para eles.
    private void addListenersManually() {
        // Listener para o botão Voltar
        jButton9.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton9ActionPerformed(evt);
            }
        });

        // Listeners para os botões "Limpar"
        bnLimparBilhete.addActionListener(this::bnLimparBilheteActionPerformed);
        bnLimparDataNAsc.addActionListener(this::bnLimparDataNAscActionPerformed);
        bnEmailLimpar.addActionListener(this::bnEmailLimparActionPerformed);
        bnLimparEndereco.addActionListener(this::bnLimparEnderecoActionPerformed);
        bnsexoLimpar.addActionListener(this::bnsexoLimparActionPerformed);
        bnLimparTelefone.addActionListener(this::bnLimparTelefoneActionPerformed);
        bnLimparNacional.addActionListener(this::bnLimparNacionalActionPerformed);
        jButton1.addActionListener(this::jButton1ActionPerformed); // Limpar para o ID
        bnLimparNome.addActionListener(this::bnLimparNomeActionPerformed); // Adicionado para o nome

        // Listeners para os botões de ação (Adicionar, Atualizar, Excluir)
        btnAdicionar.addActionListener(this::btnAdicionarActionPerformed);
        btnAtualizar.addActionListener(this::btnAtualizarActionPerformed);
        btnExcluir.addActionListener(this::btnExcluirActionPerformed);

        // Listeners para os JRadioButtons (se houver alguma lógica específica)
        jRadioButton1.addActionListener(this::jRadioButton1ActionPerformed);
        jRadioButton2.addActionListener(this::jRadioButton2ActionPerformed);

        // Listeners para os JTextFields (se houver alguma lógica de evento de texto, o que é menos comum para simples campos)
        txtID.addActionListener(this::txtIDActionPerformed); // Exemplo, se você quiser algo ao pressionar Enter no campo ID
        txtNomeCompleto.addActionListener(this::txtNomeCompletoActionPerformed);
        txtNumeroBilhete.addActionListener(this::txtNumeroBilheteActionPerformed);
        txtDataNascimento.addActionListener(this::txtDataNascimentoActionPerformed);
        txtTelefone.addActionListener(this::txtTelefoneActionPerformed);
        txtEmail.addActionListener(this::txtEmailActionPerformed);
        txtEndereco.addActionListener(this::txtEnderecoActionPerformed);
        txtNacionalidade.addActionListener(this::txtNacionalidadeActionPerformed);
        txtObservacoes.addActionListener(this::txtObservacoesActionPerformed); // Para JTextArea, geralmente usa DocumentListener
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalCadastro = new javax.swing.JPanel();
        txCadastroHóspedes = new javax.swing.JLabel();
        txNomeCompleto = new javax.swing.JLabel();
        txNºBilhete = new javax.swing.JLabel();
        txDataNasc = new javax.swing.JLabel();
        txTelefone = new javax.swing.JLabel();
        txEmail = new javax.swing.JLabel();
        txNacionalidade = new javax.swing.JLabel();
        txEndereco = new javax.swing.JLabel();
        lbSexo = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();

        // **CORREÇÃO CRÍTICA AQUI:**
        // Os nomes das variáveis dos JTextFields e JTextAreas devem ser os mesmos
        // que você usa nos métodos `btnAdicionarActionPerformed`, `btnExcluirActionPerformed`, etc.
        // No seu código original, você usava `jTextField1`, `jTextField2`, etc.
        // no `initComponents` e `txtID`, `txtNomeCompleto`, etc. nos métodos de ação.
        // Isso causaria erros de compilação ou NullPointerExceptions.
        // Renomeei-os aqui para corresponder aos nomes que você usou nos métodos de ação.
        // SE VOCÊ PREFERIR MANTER jTextField1, jTextField2, etc., VOCÊ DEVE MUDAR OS NOMES
        // NOS MÉTODOS actionPerformed (ex: de `txtID.getText()` para `jTextField8.getText()`).

        txtNomeCompleto = new javax.swing.JTextField(); // Era jTextField2
        txtNumeroBilhete = new javax.swing.JTextField(); // Era jTextField3
        txtDataNascimento = new javax.swing.JTextField(); // Era jTextField1
        txtEmail = new javax.swing.JTextField(); // Era jTextField4
        txtEndereco = new javax.swing.JTextField(); // Era jTextField5
        txtTelefone = new javax.swing.JTextField(); // Era jTextField6
        txtNacionalidade = new javax.swing.JTextField(); // Era jTextField11
        txtID = new javax.swing.JTextField(); // Era jTextField8

        jScrollPaneObservacoes = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnAdicionar = new javax.swing.JButton();
        btnAtualizar = new javax.swing.JButton();
        btnExcluir = new javax.swing.JButton();
        bnLimparNome = new javax.swing.JButton();
        bnLimparBilhete = new javax.swing.JButton();
        bnLimparDataNAsc = new javax.swing.JButton();
        bnEmailLimpar = new javax.swing.JButton();
        bnLimparEndereco = new javax.swing.JButton();
        bnsexoLimpar = new javax.swing.JButton();
        bnLimparTelefone = new javax.swing.JButton();
        bnLimparNacional = new javax.swing.JButton();
        txObservações = new javax.swing.JLabel();
        jButton9 = new javax.swing.JButton();
        Logo = new javax.swing.JLabel();
        txID = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Cadastro de Clientes/Hóspedes");
        setBackground(new java.awt.Color(255, 255, 255));
        setPreferredSize(new java.awt.Dimension(990, 1000));
        setResizable(false);

        jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
        jScrollPane1.setForeground(new java.awt.Color(255, 255, 255));
        jScrollPane1.setMaximumSize(new java.awt.Dimension(42767, 42767));

        painelPrincipalCadastro.setBackground(new java.awt.Color(255, 255, 255));

        txCadastroHóspedes.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        txCadastroHóspedes.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        txCadastroHóspedes.setText("Cadastro de Hóspedes");
        txCadastroHóspedes.setAlignmentX(0.5F);

        txNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNomeCompleto.setText("Nome Completo:");

        txNºBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNºBilhete.setText("Nº de Bilhete");

        txDataNasc.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txDataNasc.setText("Data Nasc.");

        txTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txTelefone.setText("Telefone");

        txEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txEmail.setText("Email");

        txNacionalidade.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txNacionalidade.setText("Nacionalidade");

        txEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txEndereco.setText("Endereço");

        lbSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lbSexo.setText("Sexo");

        jRadioButton1.setText("Feminino");
        // jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
        //     public void actionPerformed(java.awt.event.ActionEvent evt) {
        //         jRadioButton1ActionPerformed(evt);
        //     }
        // });
        // Comentado pois o listener será adicionado em addListenersManually()

        jRadioButton2.setText("Masculino");

        // Configuração dos JTextFields com os nomes corrigidos
        // txtNomeCompleto.addActionListener(new java.awt.event.ActionListener() {
        //     public void actionPerformed(java.awt.event.ActionEvent evt) {
        //         txtNomeCompletoActionPerformed(evt); // Renomeado
        //     }
        // });
        // Comentado pois o listener será adicionado em addListenersManually()


        // txtNumeroBilhete.addActionListener(new java.awt.event.ActionListener() {
        //     public void actionPerformed(java.awt.event.ActionEvent evt) {
        //         txtNumeroBilheteActionPerformed(evt); // Renomeado
        //     }
        // });
        // Comentado pois o listener será adicionado em addListenersManually()


        // txtDataNascimento.addActionListener(new java.awt.event.ActionListener() {
        //     public void actionPerformed(java.awt.event.ActionEvent evt) {
        //         txtDataNascimentoActionPerformed(evt); // Renomeado
        //     }
        // });
        // Comentado pois o listener será adicionado em addListenersManually()

        txtObservacoes.setColumns(20);
        txtObservacoes.setLineWrap(true);
        txtObservacoes.setRows(5);
        txtObservacoes.setWrapStyleWord(true);
        jScrollPaneObservacoes.setViewportView(txtObservacoes);

        btnAdicionar.setText("Adicionar");
        // btnAdicionar.addActionListener(new java.awt.event.ActionListener() {
        //     public void actionPerformed(java.awt.event.ActionEvent evt) {
        //         btnAdicionarActionPerformed(evt);
        //     }
        // });
        // Comentado pois o listener será adicionado em addListenersManually()

        btnAtualizar.setText("Atualizar");
        // btnAtualizar.addActionListener(new java.awt.event.ActionListener() {
        //     public void actionPerformed(java.awt.event.ActionEvent evt) {
        //         btnAtualizarActionPerformed(evt);
        //     }
        // });
        // Comentado pois o listener será adicionado em addListenersManually()

        btnExcluir.setText("Excluir");
        // btnExcluir.addActionListener(new java.awt.event.ActionListener() {
        //     public void actionPerformed(java.awt.event.ActionEvent evt) {
        //         btnExcluirActionPerformed(evt);
        //     }
        // });
        // Comentado pois o listener será adicionado em addListenersManually()

        bnLimparNome.setText("Limpar"); // Adicionado explicitamente
        bnLimparBilhete.setText("Limpar");
        bnLimparDataNAsc.setText("Limpar");
        bnEmailLimpar.setText("Limpar");
        bnLimparEndereco.setText("Limpar");
        bnsexoLimpar.setText("Limpar");
        bnLimparTelefone.setText("Limpar");
        bnLimparNacional.setText("Limpar");

        txObservações.setText("Observações");

        jButton9.setText("Voltar");

        Logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        txID.setFont(new java.awt.Font("Liberation Sans", 1, 18)); // NOI18N
        txID.setText("Id");

        jButton1.setText("Limpar");

        javax.swing.GroupLayout painelPrincipalCadastroLayout = new javax.swing.GroupLayout(painelPrincipalCadastro);
        painelPrincipalCadastro.setLayout(painelPrincipalCadastroLayout);
        painelPrincipalCadastroLayout.setHorizontalGroup(
            painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createSequentialGroup()
                .addContainerGap(237, Short.MAX_VALUE)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txNºBilhete, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txDataNasc)
                            .addComponent(txEmail)
                            .addComponent(txEndereco)
                            .addComponent(txTelefone)
                            .addComponent(txNacionalidade)
                            .addComponent(lbSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 51, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(txNomeCompleto, javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                    .addComponent(btnAdicionar)
                                    .addGap(25, 25, 25))))
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                .addGap(18, 18, 18)
                                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                        .addComponent(jRadioButton2)
                                        .addGap(86, 86, 86)
                                        .addComponent(jRadioButton1)
                                        .addGap(128, 128, 128))
                                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                            .addComponent(txObservações)
                                            .addGap(27, 27, 27)
                                            .addComponent(jScrollPaneObservacoes, javax.swing.GroupLayout.PREFERRED_SIZE, 234, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, painelPrincipalCadastroLayout.createSequentialGroup()
                                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                                .addComponent(txtTelefone, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField6
                                                .addComponent(txtEndereco, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField5
                                                .addComponent(txtEmail, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField4
                                                .addComponent(txtDataNascimento, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField1
                                                .addComponent(txtNumeroBilhete, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField3
                                                .addComponent(txtNomeCompleto, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField2
                                                .addComponent(txtID, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField8
                                                .addComponent(txtNacionalidade, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)) // Era jTextField11
                                            .addGap(27, 27, 27)
                                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(bnLimparNome)
                                                .addComponent(jButton1)
                                                .addComponent(bnLimparBilhete)
                                                .addComponent(bnLimparDataNAsc)
                                                .addComponent(bnEmailLimpar)
                                                .addComponent(bnLimparEndereco)
                                                .addComponent(bnsexoLimpar)
                                                .addComponent(bnLimparTelefone)
                                                .addComponent(bnLimparNacional))))))
                            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                .addGap(95, 95, 95)
                                .addComponent(btnAtualizar, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(409, 409, 409))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addComponent(txID, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(263, 263, 263))))
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGap(296, 296, 296)
                .addComponent(txCadastroHóspedes, javax.swing.GroupLayout.PREFERRED_SIZE, 447, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGap(275, 275, 275)
                .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 381, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(181, 181, 181))
        );
        painelPrincipalCadastroLayout.setVerticalGroup(
            painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(168, 168, 168)
                        .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txCadastroHóspedes)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 42, Short.MAX_VALUE)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(txID, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField8
                        .addComponent(jButton1)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtNomeCompleto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField2
                        .addComponent(bnLimparNome))
                    .addComponent(txNomeCompleto))
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(30, 30, 30)
                        .addComponent(bnLimparBilhete))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtNumeroBilhete, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField3
                            .addComponent(txNºBilhete))))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtDataNascimento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField1
                        .addComponent(bnLimparDataNAsc))
                    .addComponent(txDataNasc))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txEmail)
                    .addComponent(txtEmail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField4
                    .addComponent(bnEmailLimpar))
                .addGap(30, 30, 30)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtEndereco, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField5
                    .addComponent(txEndereco)
                    .addComponent(bnLimparEndereco))
                .addGap(24, 24, 24)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtTelefone, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField6
                    .addComponent(bnsexoLimpar) // Este botão deveria ser para telefone, não sexo
                    .addComponent(txTelefone))
                .addGap(33, 33, 33)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtNacionalidade, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) // Era jTextField11
                    .addComponent(bnLimparTelefone) // Este botão deveria ser para nacionalidade
                    .addComponent(txNacionalidade))
                .addGap(21, 21, 21)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bnLimparNacional) // Este botão deveria ser para sexo
                    .addComponent(jRadioButton2)
                    .addComponent(jRadioButton1)
                    .addComponent(lbSexo))
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(45, 45, 45)
                        .addComponent(txObservações))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPaneObservacoes, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(24, 24, 24)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnAtualizar)
                    .addComponent(btnExcluir)
                    .addComponent(btnAdicionar))
                .addContainerGap(654, Short.MAX_VALUE))
        );

        jScrollPane1.setViewportView(painelPrincipalCadastro);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1085, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 962, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(19, 19, 19))
        );

        pack();
    }// </editor-fold>

    private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        // Validação dos campos
        String id = txtID.getText().trim();
        String nomeCompleto = txtNomeCompleto.getText().trim();
        String numeroBilhete = txtNumeroBilhete.getText().trim();
        String dataNascimentoStr = txtDataNascimento.getText().trim();
        String telefone = txtTelefone.getText().trim();
        String email = txtEmail.getText().trim();
        String endereco = txtEndereco.getText().trim();
        String nacionalidade = txtNacionalidade.getText().trim();
        String sexo = "";
        String observacoes = txtObservacoes.getText().trim();

        // 1. Validação de campos obrigatórios
        if (id.isEmpty() || nomeCompleto.isEmpty() || numeroBilhete.isEmpty() ||
            dataNascimentoStr.isEmpty() || telefone.isEmpty() || email.isEmpty() ||
            endereco.isEmpty() || nacionalidade.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Por favor, preencha todos os campos obrigatórios.", "Campos Vazios", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 2. Validação de Sexo (radio buttons)
        if (!jRadioButton1.isSelected() && !jRadioButton2.isSelected()) {
            JOptionPane.showMessageDialog(this, "Por favor, selecione o sexo do hóspede.", "Campo Obrigatório", JOptionPane.WARNING_MESSAGE);
            return;
        } else {
            if (jRadioButton1.isSelected()) {
                sexo = "Feminino";
            } else if (jRadioButton2.isSelected()) {
                sexo = "Masculino";
            }
        }

        // 3. Validação de Email (formato básico)
        String emailRegex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
        Pattern emailPattern = Pattern.compile(emailRegex);
        Matcher emailMatcher = emailPattern.matcher(email);
        if (!emailMatcher.matches()) {
            JOptionPane.showMessageDialog(this, "O email inserido não é válido.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 4. Validação de Telefone (apenas números, pode ser aprimorado para DDD, etc.)
        // Alterado para permitir espaços e hífens, mas verificar que após remover, seja apenas dígitos
        String telefoneCleaned = telefone.replaceAll("[\\s-]", "");
        if (!telefoneCleaned.matches("\\d+")) {
            JOptionPane.showMessageDialog(this, "O telefone deve conter apenas números, espaços ou hífens válidos.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 5. Validação de Data de Nascimento (formato dd/MM/yyyy)
        LocalDate dataNascimento = null;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        try {
            dataNascimento = LocalDate.parse(dataNascimentoStr, formatter);
            // Opcional: Validar se a data não é futura
            if (dataNascimento.isAfter(LocalDate.now())) {
                JOptionPane.showMessageDialog(this, "A data de nascimento não pode ser futura.", "Data Inválida", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use dd/MM/yyyy.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            logger.log(Level.WARNING, "Erro de parsing de data de nascimento: " + dataNascimentoStr, e);
            return;
        }
        
        // Se todas as validações passaram
        JOptionPane.showMessageDialog(this, "Hóspede adicionado com sucesso!\n" +
                                            "ID: " + id + "\n" +
                                            "Nome: " + nomeCompleto + "\n" +
                                            "Bilhete: " + numeroBilhete + "\n" +
                                            "Data Nasc.: " + dataNascimentoStr + "\n" +
                                            "Telefone: " + telefone + "\n" +
                                            "Email: " + email + "\n" +
                                            "Endereço: " + endereco + "\n" +
                                            "Nacionalidade: " + nacionalidade + "\n" +
                                            "Sexo: " + sexo + "\n" +
                                            "Observações: " + observacoes,
                                            "Sucesso", JOptionPane.INFORMATION_MESSAGE);

        logger.log(Level.INFO, "Hóspede adicionado: {0}", nomeCompleto);
    }

    private void btnExcluirActionPerformed(java.awt.event.ActionEvent evt) {
        // Lógica de exclusão:
        // 1. Obter o ID ou outro identificador para exclusão (ex: txtID.getText())
        String idParaExcluir = txtID.getText().trim();
        if (idParaExcluir.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Por favor, insira o ID do hóspede a ser excluído.", "Campo Obrigatório", JOptionPane.WARNING_MESSAGE);
            return;
        }

        int confirm = JOptionPane.showConfirmDialog(this, "Tem certeza que deseja excluir o hóspede com ID: " + idParaExcluir + "?", "Confirmar Exclusão", JOptionPane.YES_NO_OPTION);
        if (confirm == JOptionPane.YES_OPTION) {
            // Implemente sua lógica de banco de dados ou lista para excluir o hóspede
            // Exemplo fictício:
            // boolean excluidoComSucesso = suaClasseDeDados.excluirHospede(idParaExcluir);
            // if (excluidoComSucesso) {
                    JOptionPane.showMessageDialog(this, "Hóspede com ID " + idParaExcluir + " excluído com sucesso!", "Exclusão Realizada", JOptionPane.INFORMATION_MESSAGE);
                    logger.log(Level.INFO, "Hóspede excluído: ID {0}", idParaExcluir);
                    limparTodosOsCampos(); // Limpa os campos após exclusão
            // } else {
            //     JOptionPane.showMessageDialog(this, "Erro ao excluir hóspede. ID não encontrado ou problema no sistema.", "Erro", JOptionPane.ERROR_MESSAGE);
            //     logger.log(Level.SEVERE, "Falha ao excluir hóspede: ID {0}", idParaExcluir);
            // }
        }
    }

    private void btnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {
        // Lógica de atualização:
        // 1. Obter todos os dados dos campos
        String id = txtID.getText().trim();
        String nomeCompleto = txtNomeCompleto.getText().trim();
        String numeroBilhete = txtNumeroBilhete.getText().trim();
        String dataNascimentoStr = txtDataNascimento.getText().trim();
        String telefone = txtTelefone.getText().trim();
        String email = txtEmail.getText().trim();
        String endereco = txtEndereco.getText().trim();
        String nacionalidade = txtNacionalidade.getText().trim();
        String sexo = "";
        String observacoes = txtObservacoes.getText().trim();

        // 2. Validação básica (pelo menos o ID e nome devem estar preenchidos para atualizar)
        if (id.isEmpty() || nomeCompleto.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Para atualizar, o ID e o Nome Completo são obrigatórios.", "Campos Obrigatórios", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // As validações de Email, Telefone e Data de Nascimento devem ser REPETIDAS aqui
        // pois os dados podem ter sido alterados antes de clicar em "Atualizar".
        // Você pode criar um método auxiliar `validarCampos()` para evitar duplicação de código.
        // Por enquanto, vou duplicá-las para mostrar onde estariam.

        // Validação de Sexo
        if (!jRadioButton1.isSelected() && !jRadioButton2.isSelected()) {
            JOptionPane.showMessageDialog(this, "Por favor, selecione o sexo do hóspede para atualizar.", "Campo Obrigatório", JOptionPane.WARNING_MESSAGE);
            return;
        } else {
            if (jRadioButton1.isSelected()) {
                sexo = "Feminino";
            } else if (jRadioButton2.isSelected()) {
                sexo = "Masculino";
            }
        }

        // Validação de Email
        String emailRegex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
        Pattern emailPattern = Pattern.compile(emailRegex);
        Matcher emailMatcher = emailPattern.matcher(email);
        if (!emailMatcher.matches()) {
            JOptionPane.showMessageDialog(this, "O email inserido não é válido para atualização.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // Validação de Telefone
        String telefoneCleaned = telefone.replaceAll("[\\s-]", "");
        if (!telefoneCleaned.matches("\\d+")) {
            JOptionPane.showMessageDialog(this, "O telefone deve conter apenas números, espaços ou hífens válidos para atualização.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // Validação de Data de Nascimento
        LocalDate dataNascimento = null;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        try {
            dataNascimento = LocalDate.parse(dataNascimentoStr, formatter);
            if (dataNascimento.isAfter(LocalDate.now())) {
                JOptionPane.showMessageDialog(this, "A data de nascimento não pode ser futura para atualização.", "Data Inválida", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido para atualização. Use dd/MM/yyyy.", "Formato Inválido", JOptionPane.WARNING_MESSAGE);
            logger.log(Level.WARNING, "Erro de parsing de data de nascimento para atualização: " + dataNascimentoStr, e);
            return;
        }

        // Se todas as validações de atualização passaram
        // Implemente sua lógica de banco de dados ou lista para atualizar o hóspede
        // Exemplo fictício:
        // boolean atualizadoComSucesso = suaClasseDeDados.atualizarHospede(id, nomeCompleto, ...);
        // if (atualizadoComSucesso) {
                JOptionPane.showMessageDialog(this, "Hóspede com ID " + id + " atualizado com sucesso!", "Atualização Realizada", JOptionPane.INFORMATION_MESSAGE);
                logger.log(Level.INFO, "Hóspede atualizado: ID {0}", id);
                // Opcional: Limpar campos ou recarregar dados após atualização
        // } else {
        //     JOptionPane.showMessageDialog(this, "Erro ao atualizar hóspede. ID não encontrado ou problema no sistema.", "Erro", JOptionPane.ERROR_MESSAGE);
        //     logger.log(Level.SEVERE, "Falha ao atualizar hóspede: ID {0}", id);
        // }
    }

    // Métodos para os botões "Limpar"
    private void bnLimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        txtNumeroBilhete.setText("");
    }

    private void bnLimparDataNAscActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataNascimento.setText("");
    }

    private void bnEmailLimparActionPerformed(java.awt.event.ActionEvent evt) {
        txtEmail.setText("");
    }

    private void bnLimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
        txtEndereco.setText("");
    }

    private void bnsexoLimparActionPerformed(java.awt.event.ActionEvent evt) {
        sexoButtonGroup.clearSelection(); // Limpa a seleção dos radio buttons
    }

    private void bnLimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) {
        txtTelefone.setText("");
    }

    private void bnLimparNacionalActionPerformed(java.awt.event.ActionEvent evt) {
        txtNacionalidade.setText("");
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // Limpar ID
        txtID.setText("");
    }

    private void bnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) { // Limpar Nome
        txtNomeCompleto.setText("");
    }


    // Métodos action listener para os JRadioButtons (se necessário)
    private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // Lógica se algo precisar acontecer quando Feminino é selecionado
        logger.log(Level.INFO, "Sexo Feminino selecionado.");
    }

    private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        // Lógica se algo precisar acontecer quando Masculino é selecionado
        logger.log(Level.INFO, "Sexo Masculino selecionado.");
    }

    // Métodos action listener para os JTextFields (menos comum, mas boa prática ter os stubs)
    private void txtIDActionPerformed(java.awt.event.ActionEvent evt) { /* Vazio, se não houver lógica específica */ }
    private void txtNomeCompletoActionPerformed(java.awt.event.ActionEvent evt) { /* Vazio, se não houver lógica específica */ }
    private void txtNumeroBilheteActionPerformed(java.awt.event.ActionEvent evt) { /* Vazio, se não houver lógica específica */ }
    private void txtDataNascimentoActionPerformed(java.awt.event.ActionEvent evt) { /* Vazio, se não houver lógica específica */ }
    private void txtTelefoneActionPerformed(java.awt.event.ActionEvent evt) { /* Vazio, se não houver lógica específica */ }
    private

O erro que está a ocorrer, java.lang.RuntimeException: Uncompilable code at telas.TelaGeralCadatro.bnHospedesActionPerformed(TelaGeralCadatro.java:1), indica que há um problema de compilação no seu código Java.

"Uncompilable code" significa que o compilador Java não conseguiu entender ou processar alguma parte do seu código na classe TelaGeralCadatro, especificamente no método bnHospedesActionPerformed na linha 1.

Este tipo de erro geralmente acontece por um dos seguintes motivos:

  1. Erros de sintaxe: O mais comum. Pode haver um ponto e vírgula faltando, uma chave não fechada, um erro de digitação no nome de uma variável ou método, ou qualquer outra coisa que faça com que o código não siga as regras da linguagem Java.
  2. Classes/métodos/variáveis não encontrados: Você pode estar a tentar usar uma classe, método ou variável que não foi importada corretamente, não existe, ou não está acessível no escopo atual.
  3. Dependências ausentes: Se você estiver a usar bibliotecas externas, pode ser que elas não estejam configuradas corretamente no seu caminho de compilação (classpath).
  4. Problemas com a versão do Java (SDK): Embora menos provável com "Uncompilable code" diretamente, se houver incompatibilidades entre a versão do SDK que você está usando para compilar e as bibliotecas ou recursos que você está a usar, isso pode levar a problemas. No seu caso, você mencionou que estará usando o SDK 52, o que é uma versão bastante nova. Certifique-se de que o seu ambiente de desenvolvimento (IDE como NetBeans, IntelliJ, Eclipse) está configurado para usar o JDK 52 (Java 24 ou superior, pois SDK 52 refere-se à versão da API e JRE/JDK 24 é o equivalente).

Para resolver este problema, siga os seguintes passos:

  1. Verifique a linha telas.TelaGeralCadatro.java:1: A mensagem de erro aponta para a linha 1 do seu arquivo TelaGeralCadatro.java. Isso é um pouco incomum, pois a linha 1 geralmente é a declaração do pacote ou importações. No entanto, o erro indica que o problema começa logo no início da sua classe.

    • Abra o arquivo telas/TelaGeralCadatro.java.
    • Examine cuidadosamente o código na linha 1 e nas linhas seguintes, especialmente a assinatura do método bnHospedesActionPerformed.
    • Procure por erros de digitação, chaves ({}), parênteses (()), pontos e vírgulas (;) ou qualquer sintaxe incorreta.
  2. Analise o método bnHospedesActionPerformed: Este é o método que está a causar o erro. O erro "Uncompilable code" significa que há algo fundamentalmente errado com a forma como este método está escrito.

    • Poste o código relevante do método bnHospedesActionPerformed para que eu possa analisá-lo com mais detalhes.
  3. Limpe e Reconstrua (Clean and Build) o Projeto: Na maioria das IDEs (Integrated Development Environments), existe uma opção para "Limpar" (Clean) e "Construir" (Build) o projeto. Isso força o compilador a recompilar todos os arquivos do zero, o que pode resolver problemas de cache ou arquivos de classe corrompidos.

    • No NetBeans: Vá em Run -> Clean and Build Project.
    • No IntelliJ IDEA: Vá em Build -> Rebuild Project.
    • No Eclipse: Vá em Project -> Clean... e selecione o seu projeto.
  4. Verifique as importações: Certifique-se de que todas as classes que você está a usar no TelaGeralCadatro foram importadas corretamente no início do arquivo (por exemplo, import javax.swing.*;).

  5. Verifique o SDK/JDK: Confirme se o seu projeto está configurado para usar o SDK 52 (ou a versão compatível do JDK, que seria Java 24 ou superior). Se você estiver usando uma versão antiga do JDK para compilar um código que usa recursos mais novos, isso pode causar o erro "Uncompilable code".

    • Em NetBeans, clique com o botão direito no seu projeto, vá em "Properties" (Propriedades), e verifique a seção "Sources" ou "Libraries" para o "Java Platform".

Se você puder compartilhar o código do método bnHospedesActionPerformed e algumas linhas antes e depois dele na classe TelaGeralCadatro.java, posso ajudá-lo a identificar o problema específico.

Ótimo! Agora com o código, consigo ver o erro.

O erro java.lang.RuntimeException: Uncompilable code at telas.TelaGeralCadatro.bnHospedesActionPerformed(TelaGeralCadatro.java:1) que você estava a receber no debug log, e a sua explicação do código, indicam que a classe que estava a lançar o erro era TelaGeralCadatro. No entanto, o código que me forneceu é da classe TelaCadastro.

É provável que tenha mudado o nome da classe, ou que tenha outra classe chamada TelaGeralCadatro no seu projeto que não me forneceu.

Assumindo que o erro de "Uncompilable code" está, de facto, na classe TelaCadastro que me forneceu, encontrei dois erros principais no código que tornam o código "uncompilable":

  1. Ponto e vírgula (;) faltando na linha 14: Você tem a seguinte linha:

    Java
    import java.time.format.DateTimeParseException
    

    Está faltando um ponto e vírgula no final desta linha. Deveria ser:

    Java
    import java.time.format.DateTimeParseException;
    
  2. Level não importado: Dentro do seu bloco catch no método btnAdicionarActionPerformed, você está a usar logger.log(Level.WARNING, ...). No entanto, a classe Level do pacote java.util.logging não foi importada.

    Para corrigir isso, adicione a seguinte importação no início do seu arquivo, junto com as outras importações:

    Java
    import java.util.logging.Level;
    

Além desses erros de compilação, observei alguns outros pontos que podem causar problemas em tempo de execução (Runtime Exceptions) ou comportamento inesperado:

  • Nomes de componentes gráficos (JTextFields): Você declarou jTextField1, jTextField2, jTextField3, jTextField4, jTextField5, jTextField6, jTextField11, e jTextField8 no initComponents(). No entanto, nos seus métodos btnAdicionarActionPerformed e btnAtualizarActionPerformed, você está a usar nomes como txtID, txtNomeCompleto, txtNumeroBilhete, txtDataNascimento, txtTelefone, txtEmail, txtEndereco, txtNacionalidade.

    Estes nomes (txtID, txtNomeCompleto, etc.) não correspondem aos nomes que foram gerados automaticamente pelo NetBeans (ou outra IDE) no initComponents(). Você precisa renomear as suas variáveis JTextField para corresponder aos nomes que está a usar nos métodos de ação, ou então alterar os nomes nos seus métodos de ação para corresponderem aos nomes gerados (jTextField1, jTextField2, etc.).

    Exemplo (se a intenção é que jTextField8 seja txtID): Você tem: jTextField8 = new javax.swing.JTextField(); Mas no btnAdicionarActionPerformed, usa: String id = txtID.getText().trim(); Isso vai gerar um NullPointerException em tempo de execução porque txtID não foi inicializado.

    Você precisa decidir quais nomes usar. É altamente recomendável que você use os nomes mais descritivos (como txtID, txtNomeCompleto) e, para fazer isso corretamente, você deve ir ao Design View da sua tela no NetBeans (ou IDE) e renomear as variáveis dos seus JTextFields.

    Por exemplo, se jTextField8 é para o ID, clique nele no Design View, vá na janela "Properties" (Propriedades), procure por "Code" ou "Variable Name" e mude jTextField8 para txtID. Faça isso para todos os JTextFields e se txtObservacoes já tem o nome correto, ótimo.

Resumo das correções essenciais para compilação:

  1. Adicione ponto e vírgula:

    Java
    import java.time.format.DateTimeParseException; // Adicionado ;
    
  2. Adicione a importação para Level:

    Java
    import java.util.logging.Level; // Adicionado
    

Depois de fazer essas duas alterações, limpe e construa (Clean and Build) o seu projeto novamente. Isso deve resolver o erro "Uncompilable code".

E, por favor, corrija os nomes das variáveis dos JTextFields para que correspondam aos nomes que você está usando nos seus métodos de ação para evitar NullPointerExceptions.

Para adicionar as validações de entrada de dados, você deve focar no método btnAdicionarActionPerformed (linha 220), pois é o local onde a lógica de salvar os dados provavelmente será implementada.

Aqui está uma explicação linha por linha de onde e como você pode adicionar as validações, usando seus JTextFields e JRadioButtons:

Java
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
/**
 *
 * @author mcdebug
 */
package telas;

import javax.swing.JOptionPane; // Importar JOptionPane para exibir mensagens

public class TelaCadastro extends javax.swing.JFrame {
    
    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadastro.class.getName());

    /**
     * Creates new form TelaCadastro
     */
    public TelaCadastro() {
        initComponents();
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                                        
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalCadastro = new javax.swing.JPanel();
        txCadastroHóspedes = new javax.swing.JLabel();
        txNomeCompleto = new javax.swing.JLabel();
        txNºBilhete = new javax.swing.JLabel();
        txDataNasc = new javax.swing.JLabel();
        txTelefone = new javax.swing.JLabel();
        txEmail = new javax.swing.JLabel();
        txNacionalidade = new javax.swing.JLabel();
        txEndereco = new javax.swing.JLabel();
        lbSexo = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        jTextField1 = new javax.swing.JTextField(); // Data de Nascimento
        jTextField2 = new javax.swing.JTextField(); // Nome Completo
        jTextField3 = new javax.swing.JTextField(); // Nº Bilhete
        jTextField4 = new javax.swing.JTextField(); // Email
        jTextField5 = new javax.swing.JTextField(); // Endereço
        jScrollPaneObservacoes = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnAdicionar = new javax.swing.JButton();
        btnAtualizar = new javax.swing.JButton();
        btnExcluir = new javax.swing.JButton();
        bnLimparNome = new javax.swing.JButton();
        bnLimparBilhete = new javax.swing.JButton();
        bnLimparDataNAsc = new javax.swing.JButton();
        bnEmailLimpar = new javax.swing.JButton();
        bnLimparEndereco = new javax.swing.JButton();
        bnsexoLimpar = new javax.swing.JButton();
        bnLimparTelefone = new javax.swing.JButton();
        bnLimparNacional = new javax.swing.JButton();
        jTextField11 = new javax.swing.JTextField(); // Nacionalidade
        jTextField6 = new javax.swing.JTextField(); // Telefone
        txObservações = new javax.swing.JLabel();
        jButton9 = new javax.swing.JButton();
        Logo = new javax.swing.JLabel();
        txID = new javax.swing.JLabel();
        jTextField8 = new javax.swing.JTextField(); // ID
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Cadastro de Clientes/Hóspedes");
        setBackground(new java.awt.Color(255, 255, 255));
        setPreferredSize(new java.awt.Dimension(990, 1000));
        setResizable(false);

        jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
        jScrollPane1.setForeground(new java.awt.Color(255, 255, 255));
        jScrollPane1.setMaximumSize(new java.awt.Dimension(42767, 42767));

        painelPrincipalCadastro.setBackground(new java.awt.Color(255, 255, 255));

        txCadastroHóspedes.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        txCadastroHóspedes.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        txCadastroHóspedes.setText("Cadastro de Hóspedes");
        txCadastroHóspedes.setAlignmentX(0.5F);

        txNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNomeCompleto.setText("Nome Completo:");

        txNºBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNºBilhete.setText("Nº de Bilhete");

        txDataNasc.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txDataNasc.setText("Data Nasc.");

        txTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txTelefone.setText("Telefone");

        txEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txEmail.setText("Email");

        txNacionalidade.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txNacionalidade.setText("Nacionalidade");

        txEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txEndereco.setText("Endereço");

        lbSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lbSexo.setText("Sexo");

        jRadioButton1.setText("Feminino");
        jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton1ActionPerformed(evt);
            }
        });

        jRadioButton2.setText("Masculino");

        jTextField1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField1ActionPerformed(evt);
            }
        });

        jTextField2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField2ActionPerformed(evt);
            }
        });

        jTextField3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField3ActionPerformed(evt);
            }
        });

        txtObservacoes.setColumns(20);
        txtObservacoes.setLineWrap(true);
        txtObservacoes.setRows(5);
        txtObservacoes.setWrapStyleWord(true);
        jScrollPaneObservacoes.setViewportView(txtObservacoes);

        btnAdicionar.setText("Adicionar");
        btnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAdicionarActionPerformed(evt);
            }
        });

        btnAtualizar.setText("Atualizar");
        btnAtualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAtualizarActionPerformed(evt);
            }
        });

        btnExcluir.setText("Excluir");
        btnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExcluirActionPerformed(evt);
            }
        });

        bnLimparNome.setText("Limpar");

        bnLimparBilhete.setText("Limpar");

        bnLimparDataNAsc.setText("Limpar");

        bnEmailLimpar.setText("Limpar");

        bnLimparEndereco.setText("Limpar");

        bnsexoLimpar.setText("Limpar");

        bnLimparTelefone.setText("Limpar");

        bnLimparNacional.setText("Limpar");

        txObservações.setText("Observações");

        jButton9.setText("Voltar");

        Logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        txID.setFont(new java.awt.Font("Liberation Sans", 1, 18)); // NOI18N
        txID.setText("Id");

        jButton1.setText("Limpar");

        javax.swing.GroupLayout painelPrincipalCadastroLayout = new javax.swing.GroupLayout(painelPrincipalCadastro);
        painelPrincipalCadastro.setLayout(painelPrincipalCadastroLayout);
        painelPrincipalCadastroLayout.setHorizontalGroup(
            painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createSequentialGroup()
                .addContainerGap(237, Short.MAX_VALUE)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txNºBilhete, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txDataNasc)
                            .addComponent(txEmail)
                            .addComponent(txEndereco)
                            .addComponent(txTelefone)
                            .addComponent(txNacionalidade)
                            .addComponent(lbSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 51, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(txNomeCompleto, javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                    .addComponent(btnAdicionar)
                                    .addGap(25, 25, 25))))
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                .addGap(18, 18, 18)
                                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                        .addComponent(jRadioButton2)
                                        .addGap(86, 86, 86)
                                        .addComponent(jRadioButton1)
                                        .addGap(128, 128, 128))
                                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                            .addComponent(txObservações)
                                            .addGap(27, 27, 27)
                                            .addComponent(jScrollPaneObservacoes, javax.swing.GroupLayout.PREFERRED_SIZE, 234, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, painelPrincipalCadastroLayout.createSequentialGroup()
                                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                                .addComponent(jTextField6, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField8, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField11, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE))
                                            .addGap(27, 27, 27)
                                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(bnLimparNome)
                                                .addComponent(jButton1)
                                                .addComponent(bnLimparBilhete)
                                                .addComponent(bnLimparDataNAsc)
                                                .addComponent(bnEmailLimpar)
                                                .addComponent(bnLimparEndereco)
                                                .addComponent(bnsexoLimpar)
                                                .addComponent(bnLimparTelefone)
                                                .addComponent(bnLimparNacional))))))
                            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                .addGap(95, 95, 95)
                                .addComponent(btnAtualizar, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(409, 409, 409))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addComponent(txID, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(263, 263, 263))))
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGap(296, 296, 296)
                .addComponent(txCadastroHóspedes, javax.swing.GroupLayout.PREFERRED_SIZE, 447, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGap(275, 275, 275)
                .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 381, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(181, 181, 181))
        );
        painelPrincipalCadastroLayout.setVerticalGroup(
            painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(168, 168, 168)
                        .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txCadastroHóspedes)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 42, Short.MAX_VALUE)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(txID, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextField8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButton1)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(bnLimparNome))
                    .addComponent(txNomeCompleto))
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(30, 30, 30)
                        .addComponent(bnLimparBilhete))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txNºBilhete))))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(bnLimparDataNAsc))
                    .addComponent(txDataNasc))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txEmail)
                    .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnEmailLimpar))
                .addGap(30, 30, 30)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txEndereco)
                    .addComponent(bnLimparEndereco))
                .addGap(24, 24, 24)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnsexoLimpar)
                    .addComponent(txTelefone))
                .addGap(33, 33, 33)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnLimparTelefone)
                    .addComponent(txNacionalidade))
                .addGap(21, 21, 21)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bnLimparNacional)
                    .addComponent(jRadioButton2)
                    .addComponent(jRadioButton1)
                    .addComponent(lbSexo))
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(45, 45, 45)
                        .addComponent(txObservações))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPaneObservacoes, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(24, 24, 24)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnAtualizar)
                    .addComponent(btnExcluir)
                    .addComponent(btnAdicionar))
                .addContainerGap(654, Short.MAX_VALUE))
        );

        jScrollPane1.setViewportView(painelPrincipalCadastro);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1085, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 962, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(19, 19, 19))
        );

        pack();
    }// </editor-fold>                                        

    private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {                                             
        // TODO add your handling code here:
        // Linha 221: Início da validação
        
        // 1. Validação do Campo 'Nome Completo' (jTextField2)
        String nomeCompleto = jTextField2.getText().trim(); // .trim() remove espaços em branco no início e fim
        if (nomeCompleto.isEmpty()) { // Verifica se o campo está vazio
            JOptionPane.showMessageDialog(this, "O campo 'Nome Completo' não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField2.requestFocusInWindow(); // Coloca o foco no campo
            return; // Interrompe a execução do método se a validação falhar
        }
        if (nomeCompleto.length() < 3) { // Exemplo: Nome deve ter pelo menos 3 caracteres
            JOptionPane.showMessageDialog(this, "O 'Nome Completo' deve ter no mínimo 3 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField2.requestFocusInWindow();
            return;
        }

        // 2. Validação do Campo 'Nº de Bilhete' (jTextField3)
        String numeroBilhete = jTextField3.getText().trim();
        if (numeroBilhete.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Nº de Bilhete' não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField3.requestFocusInWindow();
            return;
        }
        // Exemplo: Validação para ter exatamente 12 dígitos (para bilhete de identidade angolano)
        if (!numeroBilhete.matches("\\d{12}")) { // \\d{12} significa exatamente 12 dígitos numéricos
            JOptionPane.showMessageDialog(this, "O 'Nº de Bilhete' deve conter exatamente 12 dígitos numéricos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField3.requestFocusInWindow();
            return;
        }

        // 3. Validação do Campo 'Data Nasc.' (jTextField1)
        String dataNascimento = jTextField1.getText().trim();
        if (dataNascimento.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Data Nasc.' não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField1.requestFocusInWindow();
            return;
        }
        // Exemplo: Validação para formato DD/MM/AAAA (Você pode usar uma biblioteca ou SimpleDateFormat para validação mais robusta)
        if (!dataNascimento.matches("\\d{2}/\\d{2}/\\d{4}")) { // Formato DD/MM/AAAA
            JOptionPane.showMessageDialog(this, "O campo 'Data Nasc.' deve estar no formato DD/MM/AAAA.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField1.requestFocusInWindow();
            return;
        }
        // Validação de data válida (ex: não aceitar 31/02/2025) - Requer mais lógica
        // SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        // dateFormat.setLenient(false); // Não permite datas inválidas como 31/02
        // try {
        //     dateFormat.parse(dataNascimento);
        // } catch (ParseException e) {
        //     JOptionPane.showMessageDialog(this, "A 'Data de Nascimento' inserida não é válida.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        //     jTextField1.requestFocusInWindow();
        //     return;
        // }

        // 4. Validação do Campo 'Email' (jTextField4)
        String email = jTextField4.getText().trim();
        if (email.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Email' não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField4.requestFocusInWindow();
            return;
        }
        // Exemplo: Validação de formato de e-mail básico (pode ser mais complexo com Regex)
        if (!email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$")) {
            JOptionPane.showMessageDialog(this, "Por favor, insira um endereço de e-mail válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField4.requestFocusInWindow();
            return;
        }

        // 5. Validação do Campo 'Endereço' (jTextField5)
        String endereco = jTextField5.getText().trim();
        if (endereco.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Endereço' não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField5.requestFocusInWindow();
            return;
        }
        if (endereco.length() < 10) { // Exemplo: Endereço deve ter pelo menos 10 caracteres
            JOptionPane.showMessageDialog(this, "O 'Endereço' deve ter no mínimo 10 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField5.requestFocusInWindow();
            return;
        }

        // 6. Validação do Campo 'Telefone' (jTextField6)
        String telefone = jTextField6.getText().trim();
        if (telefone.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Telefone' não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField6.requestFocusInWindow();
            return;
        }
        // Exemplo: Validação para ter 9 dígitos (para números de telefone angolanos)
        if (!telefone.matches("\\d{9}")) { // \\d{9} significa exatamente 9 dígitos numéricos
            JOptionPane.showMessageDialog(this, "O 'Telefone' deve conter exatamente 9 dígitos numéricos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField6.requestFocusInWindow();
            return;
        }

        // 7. Validação do Campo 'Nacionalidade' (jTextField11)
        String nacionalidade = jTextField11.getText().trim();
        if (nacionalidade.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Nacionalidade' não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField11.requestFocusInWindow();
            return;
        }
        if (nacionalidade.length() < 2) { // Exemplo: Nacionalidade deve ter pelo menos 2 caracteres
            JOptionPane.showMessageDialog(this, "A 'Nacionalidade' deve ter no mínimo 2 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            jTextField11.requestFocusInWindow();
            return;
        }

        // 8. Validação dos Radio Buttons 'Sexo' (jRadioButton1 e jRadioButton2)
        if (!jRadioButton1.isSelected() && !jRadioButton2.isSelected()) {
            JOptionPane.showMessageDialog(this, "Por favor, selecione o 'Sexo'.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            // Não há um JTextField para focar, mas a mensagem já alerta o usuário.
            return;
        }
        
        // 9. Validação do Campo 'Observações' (txtObservacoes) - Opcional, mas útil
        String observacoes = txtObservacoes.getText().trim();
        // Se for um campo opcional, você não precisa de uma validação de .isEmpty()
        // Mas pode adicionar um limite máximo de caracteres, por exemplo:
        if (observacoes.length() > 500) {
            JOptionPane.showMessageDialog(this, "As 'Observações' excedem o limite de 500 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtObservacoes.requestFocusInWindow();
            return;
        }
        
        // Se todas as validações passarem, você pode prosseguir com a lógica de adicionar/salvar os dados.
        // Por exemplo:
        // Chame seu método para salvar no banco de dados ou em uma lista
        // Hóspede novoHospede = new Hóspede(nomeCompleto, numeroBilhete, ...);
        // hospedeDAO.adicionar(novoHospede);
        JOptionPane.showMessageDialog(this, "Dados do hóspede adicionados com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
        
        // Opcional: Limpar os campos após o sucesso
        // LimparCampos(); 
    }                                            

    private void btnExcluirActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
    }                                          

    private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
    }                                           

    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
    }                                           

    private void btnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {                                             
        // TODO add your handling code here:
    }                                            

    private void jTextField3ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
    }                                           

    private void jRadioButton1ActionPerformed(java.awt

Podes adicionar as validações principalmente no método btnAdicionarActionPerformed (linha 225), antes de qualquer lógica para adicionar os dados. Também é uma boa prática adicionar validações nos métodos btnAtualizarActionPerformed (linha 235) e btnExcluirActionPerformed (linha 230), dependendo da lógica que terás para essas ações.

Vou explicar linha por linha e dar exemplos de onde colocar as validações para cada campo:

Java
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
/**
 *
 * @author mcdebug
 */
package telas;

import javax.swing.JOptionPane; // Importa JOptionPane para exibir mensagens de erro
import java.time.LocalDate; // Para validação de data
import java.time.format.DateTimeParseException; // Para lidar com erros de formato de data
import java.util.regex.Matcher; // Para validação de email e telefone
import java.util.regex.Pattern; // Para validação de email e telefone

public class TelaCadastro extends javax.swing.JFrame {

    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadastro.class.getName());

    /**
     * Creates new form TelaCadastro
     */
    public TelaCadastro() {
        initComponents();
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalCadastro = new javax.swing.JPanel();
        txCadastroHóspedes = new javax.swing.JLabel();
        txNomeCompleto = new javax.swing.JLabel();
        txNºBilhete = new javax.swing.JLabel();
        txDataNasc = new javax.swing.JLabel();
        txTelefone = new javax.swing.JLabel();
        txEmail = new javax.swing.JLabel();
        txNacionalidade = new javax.swing.JLabel();
        txEndereco = new javax.swing.JLabel();
        lbSexo = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        jTextField1 = new javax.swing.JTextField(); // Este é provavelmente o campo DataNasc
        jTextField2 = new javax.swing.JTextField(); // Este é provavelmente o campo Nome Completo
        jTextField3 = new javax.swing.JTextField(); // Este é provavelmente o campo Nº Bilhete
        jTextField4 = new javax.swing.JTextField(); // Este é provavelmente o campo Email
        jTextField5 = new javax.swing.JTextField(); // Este é provavelmente o campo Endereço
        jScrollPaneObservacoes = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnAdicionar = new javax.swing.JButton();
        btnAtualizar = new javax.swing.JButton();
        btnExcluir = new javax.swing.JButton();
        bnLimparNome = new javax.swing.JButton();
        bnLimparBilhete = new javax.swing.JButton();
        bnLimparDataNAsc = new javax.swing.JButton();
        bnEmailLimpar = new javax.swing.JButton();
        bnLimparEndereco = new javax.swing.JButton();
        bnsexoLimpar = new javax.swing.JButton();
        bnLimparTelefone = new javax.swing.JButton();
        bnLimparNacional = new javax.swing.JButton();
        jTextField11 = new javax.swing.JTextField(); // Este é provavelmente o campo Nacionalidade
        jTextField6 = new javax.swing.JTextField(); // Este é provavelmente o campo Telefone
        txObservações = new javax.swing.JLabel();
        jButton9 = new javax.swing.JButton();
        Logo = new javax.swing.JLabel();
        txID = new javax.swing.JLabel();
        jTextField8 = new javax.swing.JTextField(); // Este é provavelmente o campo ID
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Cadastro de Clientes/Hóspedes");
        setBackground(new java.awt.Color(255, 255, 255));
        setPreferredSize(new java.awt.Dimension(990, 1000));
        setResizable(false);

        jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
        jScrollPane1.setForeground(new java.awt.Color(255, 255, 255));
        jScrollPane1.setMaximumSize(new java.awt.Dimension(42767, 42767));

        painelPrincipalCadastro.setBackground(new java.awt.Color(255, 255, 255));

        txCadastroHóspedes.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        txCadastroHóspedes.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        txCadastroHóspedes.setText("Cadastro de Hóspedes");
        txCadastroHóspedes.setAlignmentX(0.5F);

        txNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNomeCompleto.setText("Nome Completo:");

        txNºBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNºBilhete.setText("Nº de Bilhete");

        txDataNasc.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txDataNasc.setText("Data Nasc.");

        txTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txTelefone.setText("Telefone");

        txEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txEmail.setText("Email");

        txNacionalidade.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txNacionalidade.setText("Nacionalidade");

        txEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        txEndereco.setText("Endereço");

        lbSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lbSexo.setText("Sexo");

        jRadioButton1.setText("Feminino");
        jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton1ActionPerformed(evt);
            }
        });

        jRadioButton2.setText("Masculino");

        jTextField1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField1ActionPerformed(evt);
            }
        });

        jTextField2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField2ActionPerformed(evt);
            }
        });

        jTextField3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField3ActionPerformed(evt);
            }
        });

        txtObservacoes.setColumns(20);
        txtObservacoes.setLineWrap(true);
        txtObservacoes.setRows(5);
        txtObservacoes.setWrapStyleWord(true);
        jScrollPaneObservacoes.setViewportView(txtObservacoes);

        btnAdicionar.setText("Adicionar");
        btnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAdicionarActionPerformed(evt);
            }
        });

        btnAtualizar.setText("Atualizar");
        btnAtualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAtualizarActionPerformed(evt);
            }
        });

        btnExcluir.setText("Excluir");
        btnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExcluirActionPerformed(evt);
            }
        });

        bnLimparNome.setText("Limpar");

        bnLimparBilhete.setText("Limpar");

        bnLimparDataNAsc.setText("Limpar");

        bnEmailLimpar.setText("Limpar");

        bnLimparEndereco.setText("Limpar");

        bnsexoLimpar.setText("Limpar");

        bnLimparTelefone.setText("Limpar");

        bnLimparNacional.setText("Limpar");

        txObservações.setText("Observações");

        jButton9.setText("Voltar");

        Logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        txID.setFont(new java.awt.Font("Liberation Sans", 1, 18)); // NOI18N
        txID.setText("Id");

        jButton1.setText("Limpar");

        javax.swing.GroupLayout painelPrincipalCadastroLayout = new javax.swing.GroupLayout(painelPrincipalCadastro);
        painelPrincipalCadastro.setLayout(painelPrincipalCadastroLayout);
        painelPrincipalCadastroLayout.setHorizontalGroup(
            painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createSequentialGroup()
                .addContainerGap(237, Short.MAX_VALUE)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txNºBilhete, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txDataNasc)
                            .addComponent(txEmail)
                            .addComponent(txEndereco)
                            .addComponent(txTelefone)
                            .addComponent(txNacionalidade)
                            .addComponent(lbSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 51, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(txNomeCompleto, javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                    .addComponent(btnAdicionar)
                                    .addGap(25, 25, 25))))
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                .addGap(18, 18, 18)
                                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                        .addComponent(jRadioButton2)
                                        .addGap(86, 86, 86)
                                        .addComponent(jRadioButton1)
                                        .addGap(128, 128, 128))
                                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                            .addComponent(txObservações)
                                            .addGap(27, 27, 27)
                                            .addComponent(jScrollPaneObservacoes, javax.swing.GroupLayout.PREFERRED_SIZE, 234, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, painelPrincipalCadastroLayout.createSequentialGroup()
                                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                                .addComponent(jTextField6, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField8, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(jTextField11, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE))
                                            .addGap(27, 27, 27)
                                            .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(bnLimparNome)
                                                .addComponent(jButton1)
                                                .addComponent(bnLimparBilhete)
                                                .addComponent(bnLimparDataNAsc)
                                                .addComponent(bnEmailLimpar)
                                                .addComponent(bnLimparEndereco)
                                                .addComponent(bnsexoLimpar)
                                                .addComponent(bnLimparTelefone)
                                                .addComponent(bnLimparNacional))))))
                            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                                .addGap(95, 95, 95)
                                .addComponent(btnAtualizar, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(409, 409, 409))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addComponent(txID, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(263, 263, 263))))
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGap(296, 296, 296)
                .addComponent(txCadastroHóspedes, javax.swing.GroupLayout.PREFERRED_SIZE, 447, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGap(275, 275, 275)
                .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 381, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(181, 181, 181))
        );
        painelPrincipalCadastroLayout.setVerticalGroup(
            painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(168, 168, 168)
                        .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txCadastroHóspedes)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 42, Short.MAX_VALUE)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(txID, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextField8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButton1)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(bnLimparNome))
                    .addComponent(txNomeCompleto))
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(30, 30, 30)
                        .addComponent(bnLimparBilhete))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txNºBilhete))))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(bnLimparDataNAsc))
                    .addComponent(txDataNasc))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txEmail)
                    .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnEmailLimpar))
                .addGap(30, 30, 30)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txEndereco)
                    .addComponent(bnLimparEndereco))
                .addGap(24, 24, 24)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnsexoLimpar)
                    .addComponent(txTelefone))
                .addGap(33, 33, 33)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnLimparTelefone)
                    .addComponent(txNacionalidade))
                .addGap(21, 21, 21)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bnLimparNacional)
                    .addComponent(jRadioButton2)
                    .addComponent(jRadioButton1)
                    .addComponent(lbSexo))
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(45, 45, 45)
                        .addComponent(txObservações))
                    .addGroup(painelPrincipalCadastroLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPaneObservacoes, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(24, 24, 24)
                .addGroup(painelPrincipalCadastroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnAtualizar)
                    .addComponent(btnExcluir)
                    .addComponent(btnAdicionar))
                .addContainerGap(654, Short.MAX_VALUE))
        );

        jScrollPane1.setViewportView(painelPrincipalCadastro);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1085, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 962, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(19, 19, 19))
        );

        pack();
    }// </editor-fold>

    private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        // Obter os valores dos campos de texto
        String idText = jTextField8.getText().trim();
        String nomeCompleto = jTextField2.getText().trim();
        String bilhete = jTextField3.getText().trim();
        String dataNascimentoStr = jTextField1.getText().trim();
        String email = jTextField4.getText().trim();
        String endereco = jTextField5.getText().trim();
        String telefone = jTextField6.getText().trim();
        String nacionalidade = jTextField11.getText().trim();
        String observacoes = txtObservacoes.getText().trim();

        // **Validações Campo a Campo:**

        // 1. Validação do ID (jTextField8)
        if (idText.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo ID não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return; // Impede que o código continue
        }
        try {
            int id = Integer.parseInt(idText);
            if (id <= 0) {
                JOptionPane.showMessageDialog(this, "O ID deve ser um número positivo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "O ID deve ser um número válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 2. Validação do Nome Completo (jTextField2)
        if (nomeCompleto.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Nome Completo não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (nomeCompleto.length() < 3) {
            JOptionPane.showMessageDialog(this, "O Nome Completo deve ter pelo menos 3 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (!nomeCompleto.matches("^[a-zA-ZáéíóúÁÉÍÓÚãõÃÕçÇ\\s]+$")) { // Permite letras, acentos e espaços
            JOptionPane.showMessageDialog(this, "O Nome Completo deve conter apenas letras e espaços.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 3. Validação do Nº de Bilhete (jTextField3)
        if (bilhete.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Nº de Bilhete não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        // Exemplo: Validação para bilhete com 12 caracteres alfanuméricos
        if (!bilhete.matches("^[a-zA-Z0-9]{12}$")) {
            JOptionPane.showMessageDialog(this, "O Nº de Bilhete deve ter 12 caracteres alfanuméricos (letras e números).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 4. Validação da Data de Nascimento (jTextField1)
        if (dataNascimentoStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Data de Nascimento não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        try {
            // Assume o formato "DD/MM/AAAA"
            String[] partesData = dataNascimentoStr.split("/");
            if (partesData.length != 3) {
                JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use DD/MM/AAAA.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
            int dia = Integer.parseInt(partesData[0]);
            int mes = Integer.parseInt(partesData[1]);
            int ano = Integer.parseInt(partesData[2]);

            // Cria uma data e verifica se é válida
            LocalDate dataNascimento = LocalDate.of(ano, mes, dia);

            // Verifica se a data não é futura
            if (dataNascimento.isAfter(LocalDate.now())) {
                JOptionPane.showMessageDialog(this, "A Data de Nascimento não pode ser no futuro.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
            // Pode adicionar uma validação para idade mínima, por exemplo, maior de 18 anos
            if (dataNascimento.plusYears(18).isAfter(LocalDate.now())) {
                 JOptionPane.showMessageDialog(this, "O hóspede deve ter pelo menos 18 anos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                 return;
            }

        } catch (NumberFormatException | DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use DD/MM/AAAA e verifique os valores de dia, mês e ano.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 5. Validação do Email (jTextField4)
        if (email.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Email não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        // Regex para validação de email simples
        String emailRegex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
        Pattern emailPattern = Pattern.compile(emailRegex);
        Matcher emailMatcher = emailPattern.matcher(email);
        if (!emailMatcher.matches()) {
            JOptionPane.showMessageDialog(this, "Formato de Email inválido. Ex: exemplo@dominio.com", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 6. Validação do Endereço (jTextField5)
        if (endereco.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Endereço não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (endereco.length() < 10) {
            JOptionPane.showMessageDialog(this, "O Endereço deve ter pelo menos 10 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 7. Validação do Telefone (jTextField6)
        if (telefone.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Telefone não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        // Exemplo: Validação para telefone com apenas dígitos e um número específico de dígitos (ex: 9 dígitos)
        if (!telefone.matches("^[0-9]{9}$")) { // Adapte para o formato de telefone angolano (ex: 9 dígitos)
            JOptionPane.showMessageDialog(this, "O Telefone deve conter apenas 9 dígitos numéricos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 8. Validação da Nacionalidade (jTextField11)
        if (nacionalidade.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Nacionalidade não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (nacionalidade.length() < 3) {
            JOptionPane.showMessageDialog(this, "A Nacionalidade deve ter pelo menos 3 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (!nacionalidade.matches("^[a-zA-ZáéíóúÁÉÍÓÚãõÃÕçÇ\\s]+$")) {
            JOptionPane.showMessageDialog(this, "A Nacionalidade deve conter apenas letras e espaços.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 9. Validação do Sexo (jRadioButton1 e jRadioButton2)
        if (!jRadioButton1.isSelected() && !jRadioButton2.isSelected()) {
            JOptionPane.showMessageDialog(this, "Selecione o Sexo (Feminino ou Masculino).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 10. Validação das Observações (txtObservacoes)
        // Você pode ter validações opcionais aqui, como limite de caracteres
        if (observacoes.length() > 500) {
            JOptionPane.showMessageDialog(this, "As Observações não podem exceder 500 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }


        // Se todas as validações passarem, você pode prosseguir com a lógica de adicionar/salvar os dados
        JOptionPane.showMessageDialog(this, "Dados válidos! Pronto para adicionar.", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
        // Coloque aqui o código para salvar os dados no banco de dados ou outra lógica
    }

    private void btnExcluirActionPerformed(java.awt.event.ActionEvent evt) {
        // Validação para exclusão:
        // Geralmente, para exclusão, você precisaria validar se um ID ou um critério de busca
        // para o hóspede a ser excluído foi fornecido.
        String idToDeleteText = jTextField8.getText().trim();
        if (idToDeleteText.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Para excluir, insira o ID do hóspede.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        try {
            int idToDelete = Integer.parseInt(idToDeleteText);
            // Aqui você chamaria sua lógica para excluir o hóspede com base no ID
            JOptionPane.showMessageDialog(this, "Hóspede com ID " + idToDelete + " pronto para exclusão.", "Aviso", JOptionPane.INFORMATION_MESSAGE);
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "O ID para exclusão deve ser um número válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        // TODO add your handling code here:
    }

    private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void btnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {
        // Validações para atualização:
        // A maioria das validações para "Adicionar" se aplicaria aqui,
        // mas você também precisaria garantir que um ID válido para atualização foi fornecido.

        String idToUpdateText = jTextField8.getText().trim();
        if (idToUpdateText.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Para atualizar, insira o ID do hóspede.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        try {
            int idToUpdate = Integer.parseInt(idToUpdateText);
            if (idToUpdate <= 0) {
                JOptionPane.showMessageDialog(this, "O ID para atualização deve ser um número positivo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "O ID para atualização deve ser um número válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // Repita as validações dos campos individuais como em `btnAdicionarActionPerformed`
        // para garantir que os dados atualizados também são válidos.
        String nomeCompleto = jTextField2.getText().trim();
        if (nomeCompleto.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Nome Completo não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        // ... (continue com as validações para todos os campos relevantes)

        JOptionPane.showMessageDialog(this, "Dados válidos para atualização! Hóspede com ID " + idToUpdateText + " pronto para atualizar.", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
        // Aqui você chamaria sua lógica para atualizar o hóspede com base no ID
        // TODO add your handling code here:
    }

    private void jTextField3ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ReflectiveOperationException | javax.swing.UnsupportedLookAndFeelException ex) {
            logger.log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(() -> new TelaCadastro().setVisible(true));
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel Logo;
    private javax.swing.JButton bnEmailLimpar;
    private javax.swing.JButton bnLimparBilhete;
    private javax.swing.JButton bnLimparDataNAsc;
    private javax.swing.JButton bnLimparEndereco;
    private javax.swing.JButton bnLimparNacional;
    private javax.swing.JButton bnLimparNome;
    private javax.swing.JButton bnLimparTelefone;
    private javax.swing.JButton bnsexoLimpar;
    private javax.swing.JButton btnAdicionar;
    private javax.swing.JButton btnAtualizar;
    private javax.swing.JButton btnExcluir;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton9;
    private javax.swing.JRadioButton jRadioButton1;
    private javax.swing.JRadioButton jRadioButton2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPaneObservacoes;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField11;
    private javax.swing.JTextField jTextField2;
    private javax.swing.JTextField jTextField3;
    private javax.swing.JTextField jTextField4;
    private javax.swing.JTextField jTextField5;
    private javax.swing.JTextField jTextField6;
    private javax.swing.JTextField jTextField8;
    private javax.swing.JLabel lbSexo;
    private javax.swing.JPanel painelPrincipalCadastro;
    private javax.swing.JLabel txCadastroHóspedes;
    private javax.swing.JLabel txDataNasc;
    private javax.swing.JLabel txEmail;
    private javax.swing.JLabel txEndereco;
    private javax.swing.JLabel txID;
    private javax.swing.JLabel txNacionalidade;
    private javax.swing.JLabel txNomeCompleto;
    private javax.swing.JLabel txNºBilhete;
    private javax.swing.JLabel txObservações;
    private javax.swing.JLabel txTelefone;
    private javax.swing.JTextArea txtObservacoes;
    // End of variables declaration
}

Explicação Linha a Linha e Onde Colocar as Validações:

  1. Linhas 10-14 (Imports):

    • Adicionei import javax.swing.JOptionPane; para poder exibir mensagens de erro para o usuário.
    • Adicionei import java.time.LocalDate; e import java.time.format.DateTimeParseException; para facilitar a validação de datas.
    • Adicionei import java.util.regex.Matcher; e import java.util.regex.Pattern; para validações de formato (como e-mail e telefone) usando expressões regulares.
  2. Linhas 225-364 (Dentro de btnAdicionarActionPerformed):

    • Esta é a função principal onde a validação de dados de entrada deve ocorrer antes de serem processados (por exemplo, salvos em um banco de dados).

    • Identificação dos JTextField: Como os JTextField não têm nomes muito descritivos (e.g., jTextField1, jTextField2), fiz uma suposição baseada nos JLabel associados e na ordem no Layout. É altamente recomendável que você renomeie esses componentes no seu designer (NetBeans, por exemplo) para algo como txtNomeCompleto, txtNumeroBilhete, txtDataNascimento, etc. Isso tornará seu código muito mais legível e fácil de manter.

    • Obtenção dos Valores (Exemplo para Nome Completo):

      Java
      String nomeCompleto = jTextField2.getText().trim();
      
      • getText(): Obtém o texto do campo.
      • trim(): Remove espaços em branco do início e do fim da string. Isso é importante para evitar que o usuário digite apenas espaços.
    • Estrutura de Validação: Para cada campo, você usará uma estrutura semelhante:

      Java
      if (condicaoDeErro) {
          JOptionPane.showMessageDialog(this, "Mensagem de erro para o usuário.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return; // Importante: interrompe a execução se houver um erro
      }
      
      • JOptionPane.showMessageDialog(): Exibe uma janela de diálogo com a mensagem de erro.
      • return;: Se uma validação falhar, você não quer continuar processando os dados, então return sai do método btnAdicionarActionPerformed.
    • Validação do ID (jTextField8):

      Java
      // 1. Validação do ID (jTextField8)
      if (idText.isEmpty()) {
          JOptionPane.showMessageDialog(this, "O campo ID não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      try {
          int id = Integer.parseInt(idText); // Tenta converter para número
          if (id <= 0) {
              JOptionPane.showMessageDialog(this, "O ID deve ser um número positivo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
              return;
          }
      } catch (NumberFormatException e) { // Captura erro se não for um número
          JOptionPane.showMessageDialog(this, "O ID deve ser um número válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      
      • Verifica se o campo está vazio.
      • Usa try-catch com Integer.parseInt() para garantir que o ID é um número.
      • Verifica se o ID é positivo.
    • Validação do Nome Completo (jTextField2):

      Java
      // 2. Validação do Nome Completo (jTextField2)
      if (nomeCompleto.isEmpty()) {
          JOptionPane.showMessageDialog(this, "O campo Nome Completo não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      if (nomeCompleto.length() < 3) { // Exemplo: Nome deve ter no mínimo 3 caracteres
          JOptionPane.showMessageDialog(this, "O Nome Completo deve ter pelo menos 3 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      if (!nomeCompleto.matches("^[a-zA-ZáéíóúÁÉÍÓÚãõÃÕçÇ\\s]+$")) { // Verifica se contém apenas letras e espaços
          JOptionPane.showMessageDialog(this, "O Nome Completo deve conter apenas letras e espaços.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      
      • Verifica se não está vazio.
      • Verifica o comprimento mínimo.
      • Usa uma expressão regular (matches()) para garantir que contém apenas letras e espaços (incluindo acentos e "ç").
    • Validação do Nº de Bilhete (jTextField3):

      Java
      // 3. Validação do Nº de Bilhete (jTextField3)
      if (bilhete.isEmpty()) {
          JOptionPane.showMessageDialog(this, "O campo Nº de Bilhete não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      // Exemplo: Validação para bilhete com 12 caracteres alfanuméricos
      if (!bilhete.matches("^[a-zA-Z0-9]{12}$")) {
          JOptionPane.showMessageDialog(this, "O Nº de Bilhete deve ter 12 caracteres alfanuméricos (letras e números).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      
      • Verifica se não está vazio.
      • Usa uma expressão regular para validar o formato do bilhete (ajuste ^[a-zA-Z0-9]{12}$ conforme o formato real do bilhete em Angola).
    • Validação da Data de Nascimento (jTextField1):

      Java
      // 4. Validação da Data de Nascimento (jTextField1)
      if (dataNascimentoStr.isEmpty()) {
          JOptionPane.showMessageDialog(this, "O campo Data de Nascimento não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      try {
          // Assume o formato "DD/MM/AAAA"
          String[] partesData = dataNascimentoStr.split("/");
          if (partesData.length != 3) {
              JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use DD/MM/AAAA.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
              return;
          }
          int dia = Integer.parseInt(partesData[0]);
          int mes = Integer.parseInt(partesData[1]);
          int ano = Integer.parseInt(partesData[2]);
      
          // Cria uma data e verifica se é válida
          LocalDate dataNascimento = LocalDate.of(ano, mes, dia);
      
          // Verifica se a data não é futura
          if (dataNascimento.isAfter(LocalDate.now())) {
              JOptionPane.showMessageDialog(this, "A Data de Nascimento não pode ser no futuro.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
              return;
          }
          // Pode adicionar uma validação para idade mínima, por exemplo, maior de 18 anos
          if (dataNascimento.plusYears(18).isAfter(LocalDate.now())) {
               JOptionPane.showMessageDialog(this, "O hóspede deve ter pelo menos 18 anos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
               return;
          }
      
      } catch (NumberFormatException | DateTimeParseException e) {
          JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use DD/MM/AAAA e verifique os valores de dia, mês e ano.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      
      • Verifica se não está vazio.
      • Tenta dividir a string da data e converter as partes em números.
      • Cria um objeto LocalDate para verificar se a data é logicamente válida (ex: 30 de fevereiro não seria válida).
      • Verifica se a data não é no futuro.
      • Adicionei uma verificação de idade mínima (18 anos).
    • Validação do Email (jTextField4):

      Java
      // 5. Validação do Email (jTextField4)
      if (email.isEmpty()) {
          JOptionPane.showMessageDialog(this, "O campo Email não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      // Regex para validação de email simples
      String emailRegex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
      Pattern emailPattern = Pattern.compile(emailRegex);
      Matcher emailMatcher = emailPattern.matcher(email);
      if (!emailMatcher.matches()) {
          JOptionPane.showMessageDialog(this, "Formato de Email inválido. Ex: exemplo@dominio.com", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      
      • Verifica se não está vazio.
      • Usa uma expressão regular padrão para validar o formato de um endereço de e-mail.
    • Validação do Endereço (jTextField5):

      Java
      // 6. Validação do Endereço (jTextField5)
      if (endereco.isEmpty()) {
          JOptionPane.showMessageDialog(this, "O campo Endereço não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      if (endereco.length() < 10) { // Exemplo: Endereço deve ter no mínimo 10 caracteres
          JOptionPane.showMessageDialog(this, "O Endereço deve ter pelo menos 10 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      
      • Verifica se não está vazio.
      • Verifica o comprimento mínimo do endereço.
    • Validação do Telefone (jTextField6):

      Java
      // 7. Validação do Telefone (jTextField6)
      if (telefone.isEmpty()) {
          JOptionPane.showMessageDialog(this, "O campo Telefone não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      // Exemplo: Validação para telefone com apenas dígitos e um número específico de dígitos (ex: 9 dígitos para Angola)
      if (!telefone.matches("^[0-9]{9}$")) { // Adapte para o formato de telefone angolano (ex: 9 dígitos)
          JOptionPane.showMessageDialog(this, "O Telefone deve conter apenas 9 dígitos numéricos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      
      • Verifica se não está vazio.
      • Usa uma expressão regular para garantir que o telefone contém apenas dígitos e um número específico de dígitos (neste exemplo, 9 dígitos para Angola).
    • Validação da Nacionalidade (jTextField11):

      Java
      // 8. Validação da Nacionalidade (jTextField11)
      if (nacionalidade.isEmpty()) {
          JOptionPane.showMessageDialog(this, "O campo Nacionalidade não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      if (nacionalidade.length() < 3) {
          JOptionPane.showMessageDialog(this, "A Nacionalidade deve ter pelo menos 3 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      if (!nacionalidade.matches("^[a-zA-ZáéíóúÁÉÍÓÚãõÃÕçÇ\\s]+$")) {
          JOptionPane.showMessageDialog(this, "A Nacionalidade deve conter apenas letras e espaços.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      
      • Verifica se não está vazio.
      • Verifica o comprimento mínimo.
      • Usa uma expressão regular para garantir que contém apenas letras e espaços.
    • Validação do Sexo (jRadioButton1 e jRadioButton2):

      Java
      // 9. Validação do Sexo (jRadioButton1 e jRadioButton2)
      if (!jRadioButton1.isSelected() && !jRadioButton2.isSelected()) {
          JOptionPane.showMessageDialog(this, "Selecione o Sexo (Feminino ou Masculino).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      
      • Verifica se nenhum dos botões de rádio para sexo foi selecionado.
    • Validação das Observações (txtObservacoes):

      Java
      // 10. Validação das Observações (txtObservacoes)
      // Você pode ter validações opcionais aqui, como limite de caracteres
      if (observacoes.length() > 500) { // Exemplo: Limite de 500 caracteres
          JOptionPane.showMessageDialog(this, "As Observações não podem exceder 500 caracteres.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
          return;
      }
      
      • Exemplo de validação de comprimento máximo.
    • Finalização da Validação (Linha 360):

      Java
      // Se todas as validações passarem, você pode prosseguir com a lógica de adicionar/salvar os dados
      JOptionPane.showMessageDialog(this, "Dados válidos! Pronto para adicionar.", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
      // Coloque aqui o código para salvar os dados no banco de dados ou outra lógica
      
      • Se o código chegar até aqui, significa que todos os campos passaram pelas validações. Agora você pode adicionar a lógica para salvar os dados.
  3. Linhas 366-388 (Dentro de btnExcluirActionPerformed):

    • Para a exclusão, geralmente você valida apenas o critério de exclusão (normalmente o ID).
    • Verifica se o campo ID (jTextField8) não está vazio e se é um número válido.
  4. Linhas 400-419 (Dentro de btnAtualizarActionPerformed):

    • Para a atualização, as validações são semelhantes às de adição, mas com um foco adicional na validação do ID para garantir que um registro existente está sendo modificado.
    • Primeiro, valida o ID (jTextField8).
    • Em seguida, você deve repetir as validações para todos os campos que podem ser atualizados (Nome Completo, Bilhete, Data de Nascimento, etc.), da mesma forma que faria no btnAdicionarActionPerformed.

Considerações Adicionais para Melhoria:

  • Renomear Componentes: Como mencionei, renomeie seus JTextField e JRadioButton no design para nomes significativos. Isso evita confusão e melhora muito a legibilidade. Por exemplo, jTextField2 poderia ser txtNomeCompleto.
  • Métodos de Validação Separados: Para um código mais limpo e reutilizável, você pode criar métodos privados separados para cada tipo de validação (ex: isValidNome(String nome), isValidEmail(String email)).
  • Mensagens de Erro Mais Específicas: As mensagens de erro são boas, mas podem ser ainda mais específicas se necessário.
  • Feedback Visual: Além das JOptionPane, você pode dar feedback visual ao usuário, como mudar a cor da borda do JTextField para vermelho quando há um erro.
  • Foco Automático: Após uma mensagem de erro, você pode definir o foco para o campo que causou o erro (ex: jTextField2.requestFocusInWindow();).
  • Desabilitar Botões/Campos: Para operações como "Excluir" ou "Atualizar", você pode desabilitar os botões até que um ID válido seja inserido ou um hóspede seja selecionado de uma lista.
  • SDK 52: A validação que adicionei é em Java puro e compatível com as versões mais recentes do Java, incluindo as que seriam usadas com o SDK 52. Não há nenhuma alteração específica relacionada ao SDK 52 que afetaria a lógica de validação de formulários Swing desta forma.

essa linhaha esta a dar erro java.awt.EventQueue.invokeLater(() -> new TelaCadastro().setVisible(true));

Sou um modelo de linguagem e o que você está me pedindo vai além das minhas capacidades.

oi

Olá! Como posso ajudar hoje?

esta a dar erro java.awt.EventQueue.invokeLater(() -> new TelaCadastro().setVisible(true));

Você está a ter um erro nessa linha: java.awt.EventQueue.invokeLater(() -> new TelaCadastro().setVisible(true));

Para que eu possa ajudar a identificar e resolver o problema, preciso de mais informações. Por favor, poderia fornecer:

  1. A mensagem de erro exata (o stack trace)? Quando ocorre um erro em Java, geralmente aparece uma mensagem longa no console (ou na janela de saída do IDE, como NetBeans ou IntelliJ). Copie e cole todo o texto dessa mensagem. É crucial para entender a causa raiz.

  2. Qual o contexto?

    • Quando esse erro ocorre? Ao tentar executar o programa? Ao compilar?
    • Você fez alguma alteração recente no código da TelaCadastro ou em outras partes do projeto?
    • Você está a usar alguma biblioteca ou framework específico além do Swing padrão?

Com a mensagem de erro completa, consigo dar-te um diagnóstico muito mais preciso e os passos para a solução!

Ah, essa é uma mensagem de erro clássica de problema de compilação ou de estrutura de ficheiros no Java!

A parte mais importante da mensagem é esta:

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable code - cannot access telas.TelaCadastro
 bad source file: TelaCadastro.java
   file does not contain class telas.TelaCadastro
   Please remove or make sure it appears in the correct subdirectory of the sourcepath.
   at telas.TelaGeralCadatro.bnHospedesActionPerformed(TelaGeralCadatro.java:1)

Isso significa que o Java não consegue encontrar ou acessar a classe TelaCadastro no pacote telas, embora o ficheiro TelaCadastro.java exista.

O problema geralmente se resume a uma destas duas causas:

  1. O nome do ficheiro TelaCadastro.java não corresponde ao nome da classe dentro dele.

    • Solução: Abra o ficheiro TelaCadastro.java e verifique se a linha public class TelaCadastro extends javax.swing.JFrame { tem exatamente o mesmo nome do ficheiro (incluindo letras maiúsculas e minúsculas). Se o nome do ficheiro for, por exemplo, telacadastro.java (com 't' minúsculo) e a classe for TelaCadastro (com 'T' maiúsculo), isso causará o erro. Ambos devem ser idênticos.
  2. O ficheiro TelaCadastro.java não está no diretório correto em relação ao seu pacote (package telas;).

    • Solução: Se o seu código começa com package telas;, o ficheiro TelaCadastro.java DEVE estar dentro de uma pasta chamada telas que, por sua vez, está dentro do seu diretório de código-fonte (geralmente src ou src/main/java em projetos Maven/Gradle).

    Vamos ver um exemplo da estrutura de diretórios esperada:

    SeuProjeto/
    ├── src/
    │   └── telas/          <-- Esta pasta "telas" DEVE existir
    │       └── TelaCadastro.java
    │   └── outras_pastas_de_pacotes/
    │       └── TelaGeralCadatro.java  (onde está o erro na linha 1)
    └── ...
    

    Se o TelaCadastro.java estiver diretamente dentro de src/ (ou seja, src/TelaCadastro.java) e você tiver package telas; no início do ficheiro, o Java não o encontrará.

Passos para resolver:

  1. Verifique o nome da classe e o nome do ficheiro:

    • Abra o ficheiro TelaCadastro.java.
    • Verifique a linha public class TelaCadastro extends javax.swing.JFrame {. O nome da classe (TelaCadastro) deve ser exatamente o mesmo nome do ficheiro (ignoring the .java extension). Se não for, renomeie o ficheiro (se estiver no NetBeans, clique com o botão direito no ficheiro e use "Refactor" -> "Rename" para garantir que o IDE atualiza todas as referências).
  2. Verifique a estrutura de diretórios:

    • No seu IDE (NetBeans, por exemplo), olhe para a "Project View".
    • Expanda "Source Packages" (ou algo similar).
    • Você deve ver telas como um pacote. Dentro de telas, você deve ver TelaCadastro.java.
    • Se TelaCadastro.java estiver "fora" do pacote telas (por exemplo, diretamente sob "Default Package" ou em outro pacote), arraste-o para o pacote telas. O IDE geralmente ajusta a linha package automaticamente. Se não, adicione package telas; no topo do ficheiro TelaCadastro.java.
  3. Limpar e Construir (Clean and Build):

    • Depois de fazer as alterações, é crucial limpar e reconstruir o seu projeto no NetBeans. Vá em Run -> Clean and Build Project (ou Clean e depois Build). Isso força o IDE a recompilar tudo e resolverá quaisquer problemas de cache ou de ficheiros .class desatualizados.

O erro telas.TelaGeralCadatro.bnHospedesActionPerformed(TelaGeralCadatro.java:1) sugere que o problema está a surgir quando o código em TelaGeralCadatro tenta abrir a TelaCadastro. Uma vez que a TelaCadastro esteja corretamente localizada e compilável, esse erro na linha 1 de TelaGeralCadatro deve desaparecer.

Compreendo que essa linha está a causar problemas, mas o erro Uncompilable code - cannot access telas.TelaCadastro que você forneceu anteriormente (e que continua a ser a causa fundamental) não significa que a linha java.awt.EventQueue.invokeLater(...) está errada em si.

Essa linha é o padrão correto para iniciar uma interface gráfica Swing. O problema é que, para essa linha funcionar, o Java precisa conseguir encontrar e compilar corretamente a classe TelaCadastro.

A mensagem de erro file does not contain class telas.TelaCadastro (o ficheiro não contém a classe telas.TelaCadastro) e Please remove or make sure it appears in the correct subdirectory of the sourcepath (por favor, remova ou certifique-se de que aparece no subdiretório correto do sourcepath) são a chave.

Isto significa que, mesmo que o ficheiro TelaCadastro.java exista, o compilador Java está a ter dificuldade em associá-lo à classe telas.TelaCadastro.

As causas mais comuns para este tipo de erro são:

  1. Nome do Ficheiro vs. Nome da Classe: O nome do ficheiro Java (.java) deve ser exatamente o mesmo que o nome da classe pública dentro dele.

    • Verificação: Abra o ficheiro TelaCadastro.java.
    • Procure a linha public class TelaCadastro extends javax.swing.JFrame {.
    • O nome TelaCadastro nesta linha tem que ser idêntico ao nome do seu ficheiro (excluindo o .java), incluindo maiúsculas e minúsculas.
    • Exemplo: Se o ficheiro se chama telacadastro.java (com 't' minúsculo) e a classe é TelaCadastro (com 'T' maiúsculo), o compilador falhará. Você precisa renomear o ficheiro para TelaCadastro.java.
  2. Localização do Ficheiro (Estrutura de Pacotes): Se o seu ficheiro TelaCadastro.java contém a linha package telas; no topo, então o ficheiro TelaCadastro.java DEVE estar dentro de uma pasta chamada telas que, por sua vez, está dentro do seu diretório de código-fonte principal (geralmente chamado src ou src/main/java).

    • Verificação: No seu IDE (NetBeans, por exemplo), navegue na sua estrutura de projeto.
    • Confirme que você tem uma pasta src (ou similar), e dentro dela, uma pasta telas, e dentro da pasta telas, o ficheiro TelaCadastro.java.
    • Exemplo da Estrutura Correta:
      SeuProjeto/
      ├── src/
      │   └── telas/          <-- O pacote 'telas' corresponde a esta pasta
      │       └── TelaCadastro.java  <-- O ficheiro da sua classe
      │       └── TelaGeralCadatro.java  <-- O outro ficheiro que tenta abrir TelaCadastro
      └── ...
      
    • Se o TelaCadastro.java não estiver na pasta telas, mova-o para lá. O NetBeans pode até perguntar se quer refatorar para manter a integridade do pacote.

A solução, novamente, foca-se na correção da classe TelaCadastro em si:

  1. Verifique a consistência do nome da classe e do ficheiro TelaCadastro.java. Renomeie o ficheiro se necessário para que corresponda exatamente ao nome da classe.
  2. Confirme que TelaCadastro.java está na subpasta telas (e que telas está sob o seu diretório de fontes, como src).
  3. Faça um "Clean and Build" (Limpar e Construir) no seu projeto. Este passo é crucial após qualquer alteração na estrutura de ficheiros ou nomes de classes. No NetBeans, vá em Run -> Clean and Build Project.

Depois de garantir que a TelaCadastro está corretamente localizada e nomeada, o compilador conseguirá criá-la e a linha java.awt.EventQueue.invokeLater(() -> new TelaCadastro().setVisible(true)); passará a funcionar, pois a classe que ela tenta instanciar estará acessível.

A linha de erro no TelaGeralCadatro.java (que é a classe que tenta abrir TelaCadastro) é apenas um reflexo de que a TelaCadastro está inacessível. Resolvendo o problema na TelaCadastro, o erro em TelaGeralCadatro desaparecerá.

Obrigado por partilhar o código da TelaGeralCadatro.java!

O erro que você está a ver agora: TelaCadastro telaHospedes = new TelaCadastro(); não é o erro principal, mas sim uma consequência do erro anterior que te referi:

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable code - cannot access telas.TelaCadastro
 bad source file: TelaCadastro.java
   file does not contain class telas.TelaCadastro
   Please remove or make sure it appears in the correct subdirectory of the sourcepath.
   at telas.TelaGeralCadatro.bnHospedesActionPerformed(TelaGeralCadatro.java:1)

Este Uncompilable code - cannot access telas.TelaCadastro significa que, no momento da compilação, o Java não conseguiu compilar ou encontrar a classe TelaCadastro.

A linha TelaCadastro telaHospedes = new TelaCadastro(); na TelaGeralCadatro está a dar erro porque a classe TelaCadastro não está disponível ou foi compilada incorretamente devido aos problemas que mencionei anteriormente.

Vamos recapitular as soluções mais prováveis e a ordem para as verificar:

  1. Nome do Ficheiro vs. Nome da Classe (Novamente, mas com foco total):

    • Vá ao ficheiro TelaCadastro.java.
    • Verifique se a linha public class TelaCadastro ... tem TelaCadastro exatamente como o nome do ficheiro (excluindo .java), incluindo maiúsculas e minúsculas.
    • Muitas vezes, o problema é que o ficheiro pode ser telacadastro.java (minúsculo) mas a classe é TelaCadastro (maiúsculo). Renomeie o ficheiro para TelaCadastro.java se for esse o caso. Se estiver a usar o NetBeans, clique com o botão direito no ficheiro no painel "Projects" (Projetos) e escolha "Refactor" -> "Rename..." (Refatorar -> Renomear...). Isso ajuda a garantir que as referências sejam atualizadas.
  2. Estrutura de Pacotes (Ainda mais importante):

    • Como o seu ficheiro TelaCadastro.java deve ter package telas; no topo, ele tem de estar fisicamente dentro de uma pasta chamada telas.
    • Confirme no seu explorador de ficheiros (ou na vista de projeto do NetBeans/IntelliJ) que a estrutura é assim:
      SeuProjeto/
      ├── src/             (ou src/main/java)
      │   └── telas/       <-- Esta pasta 'telas' é crucial
      │       └── TelaCadastro.java
      │       └── TelaGeralCadatro.java
      └── ...
      
    • Se TelaCadastro.java estiver noutra pasta (por exemplo, diretamente em src ou noutro pacote), mova-o para a pasta telas.
  3. Clean and Build (Limpar e Construir):

    • Depois de fazer qualquer alteração no nome do ficheiro ou na estrutura de pastas, é ABSOLUTAMENTE ESSENCIAL que você faça um "Clean and Build" (Limpar e Construir) no seu projeto.
    • No NetBeans: Vá a Run (Executar) no menu superior, depois selecione Clean and Build Project (Limpar e Construir Projeto).
    • Isso força o NetBeans a apagar quaisquer ficheiros compilados antigos (.class) e a recompilar todo o projeto do zero, o que geralmente resolve esses problemas de "uncompilable code" ou "cannot access class".

O seu código TelaGeralCadatro está correto na forma como tenta instanciar TelaCadastro (TelaCadastro telaHospedes = new TelaCadastro();). O problema está unicamente na capacidade do Java de COMPILAR ou ENCONTRAR a definição da classe TelaCadastro em primeiro lugar.

Verifique esses três pontos com atenção, especialmente os pontos 1 e 2. O "Clean and Build" é o passo final para garantir que as alterações sejam efetivas.

Você está a dizer que o erro ocorre na linha package telas; do ficheiro TelaCadastro.java.

Se o erro está a ocorrer especificamente na linha package telas;, as causas são quase sempre relacionadas à estrutura de diretórios do seu projeto ou à forma como o seu IDE (NetBeans, IntelliJ, Eclipse) está a interpretar essa estrutura.

O compilador Java espera que, se um ficheiro Java declara package telas;, ele esteja localizado fisicamente dentro de uma pasta chamada telas, que por sua vez está dentro de um dos seus "diretórios de origem" (source folders), como src ou src/main/java.

Vamos verificar as causas e soluções mais prováveis para um erro na linha package telas;:

  1. O ficheiro TelaCadastro.java não está na pasta telas:

    • Causa: Você tem package telas; no ficheiro TelaCadastro.java, mas o ficheiro não está na subpasta telas dentro do seu diretório de código-fonte. Por exemplo, ele pode estar diretamente em src/, ou em src/outro_pacote/.
    • Solução: No seu IDE (NetBeans, por exemplo):
      • No painel "Projects" (Projetos), expanda "Source Packages" (Pacotes de Origem).
      • Você deve ver uma pasta telas.
      • Certifique-se de que TelaCadastro.java está dentro dessa pasta telas. Se não estiver, arraste-o para lá. O IDE geralmente irá perguntar se deseja refatorar ou mover, o que é o correto.
  2. Duplicação da pasta telas (menos comum, mas possível):

    • Causa: Às vezes, as pessoas criam uma estrutura como src/telas/telas/TelaCadastro.java por engano. Se o seu pacote é telas, você só precisa de uma pasta telas no nível superior do seu código-fonte.
    • Solução: Verifique o caminho completo do ficheiro. Ele deve ser algo como SeuProjeto/src/telas/TelaCadastro.java. Ajuste a estrutura se houver duplicação.
  3. Configuração Incorreta do "Source Path" no IDE:

    • Causa: O seu IDE não está a reconhecer a pasta onde telas reside como um diretório de código-fonte válido. Isso geralmente acontece se você importou o projeto de forma incorreta ou se houve alguma alteração manual nos ficheiros de configuração do projeto.
    • Solução (NetBeans):
      • Clique com o botão direito no seu Projeto (o nome principal do seu projeto, não numa pasta específica).
      • Selecione "Properties" (Propriedades).
      • Vá para a categoria "Sources" (Fontes).
      • Certifique-se de que o diretório que contém a pasta telas (por exemplo, src ou src/main/java) está listado como um "Source Folder" (Pasta de Origem).

Passos a seguir para resolver o erro na linha package telas; da TelaCadastro.java:

  1. Feche o NetBeans (se estiver a usá-lo). Às vezes, reiniciar ajuda a limpar caches internos.

  2. No explorador de ficheiros do seu sistema operacional:

    • Navegue até a pasta raiz do seu projeto (onde está o pom.xml se for Maven, ou a pasta do projeto NetBeans).
    • Dentro dessa pasta, procure src/.
    • Dentro de src/, você deve ter uma pasta telas.
    • Confirme que o ficheiro TelaCadastro.java está diretamente dentro da pasta telas.
    • Se não estiver, mova TelaCadastro.java para dentro da pasta telas.
  3. Reabra o NetBeans e faça um "Clean and Build":

    • No NetBeans, clique com o botão direito no seu projeto.
    • Vá em Run -> Clean and Build Project.

Se, depois de verificar a estrutura de pastas e fazer o "Clean and Build", o erro persistir, por favor, forneça uma captura de ecrã (screenshot) da estrutura de ficheiros do seu projeto no NetBeans (o painel "Projects" ou "Projetos" expandido até mostrar Source Packages e a pasta telas com TelaCadastro.java dentro). Isso ajudará a visualizar exatamente o que está a acontecer.

Você está correto, as imagens mostram a estrutura do projeto no NetBeans, e parece que a TelaCadastro.java está na pasta telas como deveria, e o package telas; está declarado.

O erro que você está a obter na execução (aquela longa mensagem no console) ainda aponta para o mesmo problema:

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable code - cannot access telas.TelaCadastro
 bad source file: TelaCadastro.java
   file does not contain class telas.TelaCadastro
   Please remove or make sure it appears in the correct subdirectory of the sourcepath.

Isto é um comportamento muito estranho, pois a imagem mostra que está tudo no sítio certo. Isso sugere que pode ser um problema de cache do NetBeans ou uma compilação antiga que está a ser executada.

Dado que a estrutura do ficheiro e o pacote parecem estar corretos, o problema é quase sempre resolvido com os passos seguintes:

  1. Fechar e Reabrir o NetBeans:

    • Feche completamente o NetBeans.
    • Abra-o novamente.
  2. Limpar e Construir o Projeto (Clean and Build):

    • No NetBeans, no painel "Projects" (Projetos), clique com o botão direito no seu projeto principal (SistemaGestaoHoteleiro).
    • Selecione "Clean and Build" (Limpar e Construir).
    • Este passo é vital, pois força o NetBeans a apagar quaisquer ficheiros .class antigos e a recompilar todo o projeto do zero, garantindo que as classes mais recentes são usadas.
  3. Verificar Erros na TelaCadastro.java:

    • Embora o erro diga "Uncompilable code - cannot access", e a estrutura esteja correta, às vezes pode haver um erro de sintaxe dentro da TelaCadastro.java que impede a sua compilação.
    • No seu NetBeans, abra a TelaCadastro.java.
    • Olhe para as margens do editor de código (à esquerda). Há algum ponto de exclamação vermelho ou linha sublinhada a vermelho indicando um erro de sintaxe dentro do próprio ficheiro TelaCadastro.java?
    • Se houver, tente corrigi-los. Pode ser algo simples como uma variável não declarada, um ponto e vírgula em falta, ou um método com o nome errado.

Explicação adicional sobre o erro: Quando o Java diz file does not contain class telas.TelaCadastro, ele não está a dizer que o ficheiro está vazio. Está a dizer que, mesmo que o ficheiro TelaCadastro.java esteja lá, o compilador não consegue gerar o arquivo .class para telas.TelaCadastro ou, se gerou, não consegue associá-lo ao pacote telas de forma a que outras classes (como TelaGeralCadatro) o encontrem. Isso geralmente acontece devido:

  • Inconsistência entre o nome do ficheiro e o nome da classe. (Você já confirmou que estão corretos, o que é bom.)
  • Inconsistência entre a declaração package telas; e a localização física do ficheiro na pasta telas. (Você também já confirmou que estão corretos.)
  • Problemas de cache do compilador ou IDE. (O "Clean and Build" resolve isso.)
  • Erros de compilação dentro do próprio TelaCadastro.java que impedem a sua compilação bem-sucedida. (Isto é o próximo a verificar.)

Por favor, execute o "Clean and Build" novamente após fechar e reabrir o NetBeans e, se o erro persistir, verifique a TelaCadastro.java por quaisquer outros erros visuais no editor.

Entendido. O "Clean and Build" que você executou (o comando ant -f /home/mcdebug/SGH/SistemaGestaoHoteleiro -Dnb.internal.action.name=rebuild clean jar) nos deu a mensagem de erro exata do compilador, o que é excelente para diagnosticar!

As mensagens de erro são:

  1. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadastro.java:1: error: unnamed class should not have package declaration package telas;

    • Diagnóstico: Este erro é muito específico e indica que o compilador Java está a interpretar TelaCadastro.java como um ficheiro que contém uma "unnamed class" (classe sem nome), que é uma funcionalidade mais recente do Java (JDK 21 em diante, geralmente) e que não permite declarações de pacote. No entanto, a sua classe TelaCadastro claramente tem um nome (public class TelaCadastro extends ...).
    • Causa Mais Provável: Este erro geralmente ocorre quando o compilador está a lidar com um ficheiro .java que não contém uma declaração de classe principal (public class NomeDaClasse { ... }) ou quando há algo estranho no início do ficheiro que o faz interpretar mal o conteúdo. No seu caso, a imagem mostrou que a classe está lá e tem nome. A causa mais comum para este erro específico com uma classe nomeada e pacote é que o NetBeans ou o seu JDK está configurado para compilar em modo "source-only" ou "single-file source code" como um script, ou está a usar uma versão do Java que tem essa feature (Java 21+) de uma forma que conflita com a estrutura de projeto padrão.
  2. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/logger.java:15: error: <identifier> expected static void log(Level SEVERE, Object object, javax.swing.UnsupportedLookAndFeelException | java.lang.ReflectiveOperationException ex) {

    • Diagnóstico: Este é um erro de sintaxe no seu ficheiro logger.java (que não tínhamos visto antes). A mensagem <identifier> expected significa que o compilador esperava um nome (identificador) onde não encontrou, ou encontrou algo que não era um nome válido naquele contexto.
    • Causa: Na linha static void log(Level SEVERE, Object object, javax.swing.UnsupportedLookAndFeelException | java.lang.ReflectiveOperationException ex) {, você está a usar o operador | (pipe) para múltiplas exceções na declaração do catch (multi-catch), o que é correto. No entanto, você está a passar Level SEVERE como um parâmetro. SEVERE deve ser um membro de java.util.logging.Level, então deveria ser Level.SEVERE, e não uma declaração de variável Level SEVERE. O nome da variável de parâmetro da exceção é ex, mas a combinação UnsupportedLookAndFeelException | ReflectiveOperationException está como um tipo da exceção, não como parte de um nome de variável.

Vamos resolver o segundo erro primeiro, pois pode estar a influenciar o primeiro.


Soluções Detalhadas:

Erro 2: telas/logger.java:15: error: <identifier> expected

  • Problema: A linha static void log(Level SEVERE, Object object, javax.swing.UnsupportedLookAndFeelException | java.lang.ReflectiveOperationException ex) { está mal formatada para uma declaração de método. O Level SEVERE parece ser um erro de digitação, e a lista de exceções combinadas (|) não é usada como tipo de parâmetro direto de um método log dessa forma.
  • Correção: Esta linha provavelmente faz parte de um bloco catch em algum lugar, onde a sintaxe de multi-catch é válida. Se esta linha for uma declaração de método (como parece ser por static void log(...)), ela está incorreta.
    • Você provavelmente tem uma classe logger personalizada. Se sim, e você quer que o método log receba uma exceção, a declaração de método seria:
      Java
      // Se a intenção é logar qualquer uma dessas exceções
      public static void log(java.util.logging.Level level, String message, Throwable thrown) {
          // Lógica de log aqui, por exemplo:
          // logger.log(level, message, thrown);
      }
      
      // Ou, se você quer um método específico para essas exceções:
      public static void logException(javax.swing.UnsupportedLookAndFeelException ex1) {
          logger.log(java.util.logging.Level.SEVERE, "Erro de LookAndFeel", ex1);
      }
      public static void logReflectiveException(java.lang.ReflectiveOperationException ex2) {
          logger.log(java.util.logging.Level.SEVERE, "Erro de Reflexão", ex2);
      }
      
      // Ou se o seu logger.java é apenas uma classe utilitária para o seu logger da API de logging
      // A linha problematica parece ser do catch de um try-catch block no main, não de uma declaração de método separada.
      // Se essa linha está dentro do bloco catch do seu main, ela deveria ser:
      // catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
      //   logger.log(Level.SEVERE, null, ex);
      // }
      // Se este é o caso, o erro NÃO ESTÁ NA DECLARAÇÃO DO CATCH, mas sim em 'logger.java'
      
    • Assumindo que telas/logger.java é a classe que tem o método log: Você tem um ficheiro chamado logger.java dentro de telas. Se sim, por favor, abra esse ficheiro e olhe para a linha 15. A declaração static void log(Level SEVERE, Object object, javax.swing.UnsupportedLookAndFeelException | java.lang.ReflectiveOperationException ex) é incorreta para um método.
      • Provavelmente, você quer passar um Level e uma Throwable (a exceção) para o método log:
        Java
        // No seu ficheiro telas/logger.java, o método 'log' deveria ser algo como:
        package telas; // Se este ficheiro for de facto um logger personalizado
        import java.util.logging.Level;
        
        public class logger { // Atenção ao nome da classe, 'logger' com 'l' minúsculo é má prática
            // ... outros métodos ou campos
            public static void log(Level level, String msg, Throwable thrown) {
                // Implementação do log aqui, por exemplo:
                System.err.println("LOG [" + level + "]: " + msg);
                if (thrown != null) {
                    thrown.printStackTrace();
                }
            }
        }
        
        • Atenção ao nome da classe logger: É uma má prática ter o nome de classe em minúsculas (logger). As classes devem começar com letra maiúscula (Logger). Isso pode gerar conflitos com java.util.logging.Logger. Se for uma classe personalizada, renomeie-a para MyLogger ou similar, e o ficheiro para MyLogger.java.

Erro 1: TelaCadastro.java:1: error: unnamed class should not have package declaration

  • Contexto: Você está a usar "preview features of Java SE 21". Isso significa que o seu projeto está configurado para usar o Java 21, que introduziu o conceito de "unnamed classes" para scripts simples.

  • Problema: O compilador está a tratar o seu TelaCadastro.java como um ficheiro de "unnamed class" (que não pode ter package nem import no seu cabeçalho), apesar de ter uma declaração de classe public class TelaCadastro. Isso pode acontecer se houver caracteres invisíveis, ou se o NetBeans estiver a invocar o compilador de uma forma específica para ficheiros "single-source-file programs".

  • Solução (tentativas em ordem):

    1. Limpar e Reconstruir (Fundamental):

      • Repita o Clean and Build no NetBeans. Esta é a primeira e mais importante ação para resolver problemas de cache de compilação.
    2. Verificar a primeira linha de TelaCadastro.java:

      • Abra TelaCadastro.java no NetBeans.
      • Verifique se há algum caractere estranho antes de package telas; na linha 1. Às vezes, um caractere invisível pode causar isso. Tente apagar a linha package telas; e reescrevê-la manualmente.
      • Verifique se não há mais nada (nem mesmo espaços) antes de package telas; na linha 1.
    3. Verificar a Declaração da Classe TelaCadastro:

      • Assegure-se de que a declaração da classe é exatamente:
        Java
        public class TelaCadastro extends javax.swing.JFrame {
            // ...
        }
        
      • Não deve haver nenhuma outra declaração de classe public no mesmo ficheiro, apenas TelaCadastro.
    4. Ajustar o Nível de Linguagem do Projeto (Se o problema persistir):

      • Se o problema continuar, pode ser que a forma como o NetBeans lida com as "preview features" do Java 21 esteja a causar a interpretação de "unnamed class".
      • No NetBeans, clique com o botão direito no seu projeto principal (SistemaGestaoHoteleiro).
      • Selecione "Properties" (Propriedades).
      • Vá para a categoria "Sources" (Fontes).
      • No campo "Source/Binary Format" (Formato Fonte/Binário) ou "Java Platform" (Plataforma Java), tente mudar para JDK 17 ou JDK 20 (se disponível), ou para o Java 21 sem "preview features" se houver essa opção. O conceito de "unnamed classes" é uma preview feature do Java 21. Se você não está a usar especificamente essa funcionalidade, pode ser melhor compilar com uma versão estável anterior ou sem as preview features.
      • Se você realmente precisa usar o Java 21 com preview features, a solução pode ser mais complexa e envolver a reconfiguração do compilador dentro do Ant, mas vamos tentar as opções mais simples primeiro.

Passos Prioritários:

  1. Corrija o erro em telas/logger.java:15 primeiro. Abra esse ficheiro, encontre a linha 15 e ajuste a declaração do método log (ou do bloco catch se for o caso) para a sintaxe correta do Java. Se precisar de ajuda com isso, partilhe o conteúdo completo de telas/logger.java.
  2. Depois de corrigir logger.java, faça um "Clean and Build" completo novamente.

Estou a quase 100% certo de que a correção desses dois erros (especialmente o do logger.java e o "Clean and Build") vai resolver o problema.

Perfeito! Agora temos o código do logger.java. A causa do erro <identifier> expected na linha 15 está clara:

Você tem: static void log(Level SEVERE, Object object, javax.swing.UnsupportedLookAndFeelException | java.lang.ReflectiveOperationException ex) {

O problema é a parte Level SEVERE e a forma como a exceção está sendo passada.

  1. Level SEVERE: SEVERE é um valor estático da enumeração Level (por exemplo, Level.SEVERE). Quando você o coloca como Level SEVERE no parâmetro, o Java espera que SEVERE seja o nome de uma variável do tipo Level, mas como SEVERE é uma palavra reservada ou um membro estático de Level, ele fica confuso.
  2. UnsupportedLookAndFeelException | java.lang.ReflectiveOperationException ex: Embora UnsupportedLookAndFeelException | java.lang.ReflectiveOperationException seja uma sintaxe válida para um catch (multi-catch), não é uma sintaxe válida para declarar o tipo de um parâmetro de método. Um parâmetro de método pode aceitar apenas um tipo.

Como corrigir o logger.java:

A forma como você usa logger.log(Level.SEVERE, null, ex); em TelaGeralCadatro.java e TelaCadastro.java indica que você está a tentar usar o logger da API de Logging padrão do Java (java.util.logging.Logger).

A solução mais simples e correta é remover o seu ficheiro logger.java completamente, porque ele está a conflitar com o java.util.logging.Logger.

Passos para corrigir:

  1. Apague o ficheiro logger.java:

    • No NetBeans, no painel "Projects" (Projetos), navegue até Source Packages -> telas.
    • Clique com o botão direito em logger.java.
    • Selecione "Delete" (Apagar).
  2. Verifique a TelaCadastro.java e TelaGeralCadatro.java:

    • Na TelaCadastro.java e na TelaGeralCadatro.java, a linha para obter o logger já está correta:
      Java
      private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadastro.class.getName());
      
      e o uso é:
      Java
      logger.log(Level.SEVERE, null, ex);
      
      Isto é a forma padrão e correta de usar o java.util.logging.Logger.
  3. Faça um "Clean and Build" no seu projeto:

    • No NetBeans, clique com o botão direito no seu projeto principal (SistemaGestaoHoteleiro).
    • Selecione "Clean and Build".

Explicação:

Você já está a importar java.util.logging.Level; e a usar java.util.logging.Logger. O seu pequeno ficheiro logger.java está a tentar criar uma sua própria classe logger que não é necessária e está a conflitar com o logger padrão do Java. Ao removê-lo, o compilador usará o java.util.logging.Logger e o Level.SEVERE corretamente, e o erro unnamed class na TelaCadastro.java (que pode ter sido uma cascata deste erro de compilação) deverá desaparecer.

Execute estes passos e tente novamente. Estou confiante de que esta é a solução para os erros que tem vindo a ter.

Compreendo perfeitamente. O que você tem é uma instância do logger padrão do Java dentro da sua classe TelaCadastro.

A linha: private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadastro.class.getName());

Significa que:

  • private: Este logger só pode ser acedido de dentro da própria classe TelaCadastro.
  • static: Existe apenas uma única instância deste logger para todas as instâncias da classe TelaCadastro. Não é criado um novo logger cada vez que você cria um new TelaCadastro().
  • final: Uma vez que o logger é inicializado (na linha em que está), a variável logger não pode ser reatribuída para referenciar outro objeto Logger.
  • java.util.logging.Logger: É o tipo da variável, indicando que é um objeto da classe Logger do pacote java.util.logging (o sistema de logging embutido do Java).
  • logger: É o nome da sua variável.
  • java.util.logging.Logger.getLogger(TelaCadastro.class.getName()): Este é o método que obtém ou cria uma instância de Logger. O TelaCadastro.class.getName() fornece o nome da sua classe (telas.TelaCadastro) como o nome para o logger, o que é uma prática recomendada para facilitar a identificação da origem das mensagens de log.

Em resumo, essa linha está perfeitamente correta e é a forma padrão de configurar um logger para a sua classe TelaCadastro usando a API de Logging do Java.

O problema anterior que você estava a ter, error: <identifier> expected, não era nesta linha da TelaCadastro.java, mas sim no seu próprio ficheiro logger.java personalizado que estava a conflitar com o java.util.logging.Logger.

A minha recomendação para corrigir o seu problema foi apagar o seu ficheiro logger.java personalizado, pois ele estava a causar conflito e não era necessário. Depois de apagar esse ficheiro, faça um "Clean and Build" novamente, e o erro deverá ser resolvido.

agora oque faco

Dado que o seu código TelaCadastro.java já contém a linha correta para usar o logger padrão do Java: private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadastro.class.getName());

E o problema que identificamos é que havia um ficheiro logger.java personalizado a causar conflito.

O que você deve fazer agora é simples e direto:

  1. Apague o ficheiro logger.java personalizado:

    • No NetBeans, no painel "Projects" (Projetos), navegue até Source Packages -> telas.
    • Procure e clique com o botão direito no ficheiro que se chama logger.java.
    • Selecione "Delete" (Apagar). Confirme a exclusão se o NetBeans perguntar.
  2. Faça um "Clean and Build" (Limpar e Construir) no seu projeto inteiro:

    • No NetBeans, no painel "Projects" (Projetos), clique com o botão direito no seu projeto principal, que é SistemaGestaoHoteleiro.
    • No menu de contexto que aparece, selecione "Clean and Build" (Limpar e Construir).

Após completar esses dois passos, tente executar o seu projeto novamente.

Explicação: O erro unnamed class should not have package declaration na TelaCadastro.java e o erro <identifier> expected no seu logger.java estavam interligados. O seu ficheiro logger.java estava malformado e, ao mesmo tempo, estava a criar um conflito de nomes ou a ser mal interpretado pelo compilador. Uma vez que você já está a usar o java.util.logging.Logger padrão do Java corretamente, o seu ficheiro logger.java personalizado é redundante e prejudicial. Ao removê-lo, você elimina a fonte dos erros de compilação. O "Clean and Build" garante que todos os ficheiros são recompilados sem o ficheiro problemático.

Obrigado por partilhar o novo log de erro! Agora estamos a lidar com apenas um erro, o que é um bom progresso:

Compiling 8 source files to /home/mcdebug/SGH/SistemaGestaoHoteleiro/build/classes /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadastro.java:1: error: unnamed class should not have package declaration package telas; Note: /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadastro.java uses preview features of Java SE 21. Note: Recompile with -Xlint:preview for details. 1 error BUILD FAILED (total time: 0 seconds)

Este erro persiste após a exclusão do logger.java, o que confirma que o problema unnamed class é independente do outro erro que tínhamos.

Diagnóstico: O compilador Java (especificamente o JDK 21 que você está a usar, ou como ele está configurado no NetBeans) está a interpretar o seu ficheiro TelaCadastro.java como uma "unnamed class" (classe sem nome). As "unnamed classes" são uma preview feature do Java 21, projetadas para simplificar pequenos scripts, e não permitem declarações de pacote (package telas;). O facto de a sua TelaCadastro.java ter uma declaração de pacote está a causar este conflito.

Soluções mais prováveis (tente nesta ordem):

  1. Reinicie o NetBeans e "Clean and Build" Novamente:

    • Às vezes, o NetBeans pode ficar com caches internos ou estados de projeto inconsistentes.
    • Feche completamente o NetBeans.
    • Abra o NetBeans novamente.
    • No painel "Projects" (Projetos), clique com o botão direito no seu projeto principal (SistemaGestaoHoteleiro).
    • Selecione "Clean and Build" (Limpar e Construir).
    • Tente executar.
  2. Verificar a PRIMEIRA linha do ficheiro TelaCadastro.java:

    • Abra TelaCadastro.java no editor do NetBeans.
    • Vá para a linha 1.
    • Certifique-se de que a linha package telas; é literalmente a primeira coisa no ficheiro, sem nenhum caractere antes dela (nem mesmo um espaço invisível ou um caractere de nova linha extra).
    • Sugestão: Apague a linha package telas; e reescreva-a manualmente (package telas;). Salve o ficheiro.
    • Faça um "Clean and Build" novamente e tente executar.
  3. Ajustar o Nível de Linguagem do Projeto (Se as anteriores falharem):

    • Se as soluções acima não resolverem, o problema está na forma como o NetBeans está a compilar o seu projeto com o Java 21 e as preview features. Se você não está a usar especificamente as "unnamed classes" ou outras preview features na sua aplicação, é melhor desativá-las para evitar este tipo de erro.
    • No NetBeans, clique com o botão direito no seu projeto principal (SistemaGestaoHoteleiro).
    • Selecione "Properties" (Propriedades).
    • Vá para a categoria "Sources" (Fontes).
    • Procure pelo campo "Source/Binary Format" (Formato Fonte/Binário) ou "Java Platform" (Plataforma Java).
    • Opção A (Recomendado): Se a sua aplicação não usa recursos específicos do Java 21 que não estão disponíveis em versões anteriores, tente mudar para "JDK 17" ou "JDK 20" (se instalados e configurados no NetBeans). O JDK 17 é uma LTS (Long-Term Support) e muito comum. Isso desativará as "preview features" do Java 21.
    • Opção B: Se você precisa usar o JDK 21, procure por uma caixa de seleção ou opção relacionada a "Enable Preview Features" (Ativar Recursos de Pré-visualização) ou "Language Level". Se estiver marcada, desmarque-a.
    • Clique em "OK" para aplicar as mudanças.
    • Faça um "Clean and Build" novamente e tente executar.

A causa mais provável, dado o seu código e o erro, é que o NetBeans está a compilar de uma forma que ativa as "preview features" e interpreta mal o ficheiro. Mudar o nível de linguagem ou desativar as preview features deve resolver.

Perfeito! Agora com o código completo da TelaCadastro.java, podemos analisar melhor.

O erro que você está a receber: /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadastro.java:1: error: unnamed class should not have package declaration package telas;

Indica que o compilador está a tratar TelaCadastro.java como um "single-file source code program" com uma "unnamed class" (uma nova funcionalidade do Java 21), que não permite a declaração de pacote. No entanto, o seu código claramente define uma classe nomeada (public class TelaCadastro).

As razões para isso geralmente são:

  1. Versão Incorreta do JDK ou Configuração do Projeto: O NetBeans está a invocar o compilador Java de uma forma que ativa as preview features do Java 21, ou está a compilar como se fosse um script simples.
  2. Caracteres Invisíveis/Estranhos: Embora seja raro, pode haver um caractere invisível antes da linha package telas; que confunde o compilador.

Ações para resolver (repite estas após cada tentativa, incluindo o "Clean and Build"):

1. Verifique (e corrija, se necessário) a PRIMEIRA linha do ficheiro TelaCadastro.java:

  • No seu editor do NetBeans, vá para a linha 1 do TelaCadastro.java.
  • A linha deve ser exatamente package telas;
  • Não deve haver nenhum espaço, tab, ou qualquer outro caractere (visível ou invisível) antes do p de package.
  • Recomendação: Coloque o cursor no início da linha 1, apague a linha package telas; completamente, e depois digite-a novamente com cuidado: package telas;. Salve o ficheiro.
  • Faça um "Clean and Build" no seu projeto (SistemaGestaoHoteleiro).

2. Ajustar as Propriedades do Projeto no NetBeans (Mais provável que resolva):

Esta é a causa mais comum para o erro unnamed class should not have package declaration quando se tem uma classe nomeada e declaração de pacote. O seu projeto está a ser compilado com as preview features do Java 21 ativadas, o que não é o comportamento padrão para projetos de aplicação Swing.

  • No NetBeans, no painel "Projects" (Projetos), clique com o botão direito no seu projeto principal (SistemaGestaoHoteleiro).

  • Selecione "Properties" (Propriedades).

  • Na janela de propriedades do projeto, navegue até a categoria "Sources" (Fontes) no lado esquerdo.

  • No lado direito, procure por:

    • "Source/Binary Format" (Formato Fonte/Binário): Se estiver definido para "JDK 21 (Preview)" ou similar, mude-o para "JDK 17" ou "JDK 20" (se você os tiver instalados). O JDK 17 é uma versão LTS (Long-Term Support) e é uma escolha segura para aplicações Swing.

    • Alternativamente, se você não quiser mudar a versão principal do JDK, procure por uma caixa de seleção "Enable Preview Features" (Ativar Recursos de Pré-visualização) ou algo parecido. Se estiver marcada, desmarque-a. (Esta opção pode não estar diretamente visível em "Sources" mas sim em "Compiling" ou "Run" dependendo da versão do NetBeans).

    • Caso não encontre a opção de "Enable Preview Features" em "Sources", procure na categoria "Compiling" ou "Build -> Compiling".

  • Clique em "OK" para fechar as propriedades do projeto.

  • Muito importante: Faça um "Clean and Build" completo no seu projeto novamente.

Por que isso acontece (e por que a solução acima é importante):

As "unnamed classes" são uma funcionalidade de pré-visualização do Java 21, criada para que desenvolvedores possam escrever e executar ficheiros .java como scripts de forma mais simples, sem a necessidade de declarar uma classe principal explícita. No entanto, elas são incompatíveis com declarações de pacote, pois são destinadas a serem ficheiros autônomos.

O NetBeans, por vezes, pode ativar automaticamente essas preview features ou interpretar o projeto de forma que as utiliza, causando conflito com a estrutura de pacotes padrão que você tem. Ao desativar as preview features ou usar um JDK LTS mais antigo (como o 17), você garante que o compilador trate o seu código como uma aplicação Java padrão, com pacotes e classes nomeadas, como é o correto para o seu projeto.

Por favor, tente esses passos e informe o resultado.

no tela cadatro esta a vir D/A ao lad do nome

Quando você diz que "no tela cadastro está a vir D/A ao lado do nome", está a referir-se à sua aplicação em execução, onde o layout visual mostra "D/A" perto de um campo de nome?

Se sim, esse "D/A" (ou algo similar) provavelmente não vem diretamente do seu código Java que me mostrou. Em vez disso, é um texto que aparece em componentes de interface gráfica (como JTextField, JLabel, etc.) no NetBeans quando:

  1. É um texto de placeholder/exemplo: O NetBeans Design View (o editor visual de GUI) muitas vezes insere textos temporários como "D/A", "jText1", "jLabel1" etc., para mostrar onde os componentes estão. Estes textos devem ser substituídos pelo seu próprio texto ou removidos.

  2. Foi definido como o texto padrão do componente: No NetBeans Design View, quando você seleciona um componente (por exemplo, um JTextField), nas suas propriedades (janela "Properties"), há uma propriedade text. Se essa propriedade tiver "D/A" como valor, ele aparecerá em tempo de execução.

  3. Há um JLabel ou outro componente de texto com esse valor: Pode haver um JLabel invisível ou mal posicionado que está a exibir "D/A".

Para corrigir isso, você precisa ir ao Design View da sua TelaCadastro.java no NetBeans:

  1. Abra TelaCadastro.java no NetBeans.

  2. No editor, clique na aba "Design" (geralmente ao lado da aba "Source").

  3. Visualize o seu formulário. Procure o campo ou o label que está a exibir "D/A".

  4. Se for um JTextField (o campo onde o utilizador digita o nome):

    • Clique no JTextField em questão (parece ser jTextField2 para o nome completo, pelo seu código).
    • No painel "Properties" (Propriedades) do NetBeans (geralmente no canto inferior direito), procure a propriedade chamada text.
    • Apague o conteúdo dessa propriedade text. Deixe-a em branco.
    • Você também pode querer definir um "placeholder" usando a propriedade toolTipText ou font para definir uma cor cinzenta e um texto de exemplo que desaparece quando o utilizador clica, mas isso requer mais código. Por agora, apenas apagar o text é o mais importante.
  5. Se for um JLabel (um rótulo de texto fixo):

    • Clique no JLabel que está a exibir "D/A".
    • No painel "Properties", procure a propriedade text.
    • Mude o valor dessa propriedade para o texto que você quer que apareça (por exemplo, "Nome Completo:") ou apague-o se não for para mostrar nada.

Depois de fazer essas alterações no Design View e salvar, faça um "Clean and Build" novamente e execute a aplicação.

O "D/A" é quase certamente um texto estático que foi colocado no designer da GUI, e não um erro de lógica do seu código Java.

Você está absolutamente correto. O erro "unnamed class should not have package declaration" na linha 10 da TelaCadastro.java continua a aparecer, mesmo após as tentativas de solucionar.

Isso é frustrante, pois a linha 10, de acordo com o código que você compartilhou, é: public class TelaCadastro extends javax.swing.JFrame

E a linha 1 é: package telas;

O compilador está a reportar o erro na linha 10, mas a mensagem diz "unnamed class should not have package declaration" e aponta para package telas;. Isso é uma inconsistência estranha na forma como o compilador está a relatar o erro, mas a raiz do problema ainda é a interpretação do ficheiro como uma "unnamed class" que está a ter uma declaração de pacote.

Já tentamos:

  • Deletar o logger.java.
  • Fazer "Clean and Build".
  • Verificar o package telas; na linha 1.

Ainda assim, o problema persiste e aponta para o uso de "preview features of Java SE 21" com uma declaração de pacote, que é incompatível.

Vamos focar mais profundamente na configuração do projeto e na possibilidade de caracteres invisíveis que o NetBeans pode estar a gerar.

Novas tentativas e verificações (proceda cuidadosamente):

  1. Eliminação Completa de Caracteres Invisíveis na Linha 1:

    • No NetBeans, abra TelaCadastro.java.
    • Coloque o cursor exatamente no início da linha 1 (antes do p de package).
    • Pressione a tecla Backspace (ou Delete) várias vezes (umas 5-10 vezes). Isso irá apagar qualquer caractere invisível que possa estar antes do package.
    • Pressione Enter para criar uma nova linha em branco.
    • Digite manualmente package telas; nesta nova linha 1.
    • Apague a linha em branco que ficou na linha 2, se houver.
    • Verifique se a linha 1 (package telas;) está perfeitamente alinhada à esquerda e se a linha 10 (public class TelaCadastro...) permanece na linha 10.
    • Salve o ficheiro.
    • Faça um "Clean and Build" no projeto (SistemaGestaoHoteleiro).
    • Tente executar novamente.
  2. Verificar e Ajustar a Plataforma Java do Projeto (Se a solução 1 falhar):

    • Esta é a medida mais provável de sucesso, se a anterior não funcionar.
    • No NetBeans, clique com o botão direito no seu projeto SistemaGestaoHoteleiro.
    • Selecione "Properties" (Propriedades).
    • No lado esquerdo, vá para a categoria "Libraries" (Bibliotecas).
    • No topo, deve haver uma opção para "Java Platform" (Plataforma Java).
    • Certifique-se de que está selecionado um JDK válido (por exemplo, JDK 17 ou JDK 20). Se estiver JDK 21 e você não está a usar recursos avançados dele, tente mudar para 17 ou 20. Se não tiver outras opções, você precisará instalar um JDK mais antigo e registrá-lo no NetBeans (Tools -> Java Platforms).
    • Em seguida, vá para a categoria "Sources" (Fontes).
    • Procure por "Source/Binary Format" (Formato Fonte/Binário). Mude-o para a mesma versão do JDK que você selecionou em "Libraries" (ex: "JDK 17").
    • Muito importante: Se houver uma opção como "Enable Preview Language Features" (ou similar, dependendo da sua versão do NetBeans), DESMARQUE-A. Esta opção é a causa provável. Pode estar em "Sources" ou noutra categoria como "Compile".
    • Clique em "OK".
    • Faça um "Clean and Build" no projeto (SistemaGestaoHoteleiro).
    • Tente executar novamente.

Contexto Importante sobre o JDK 21 e "Unnamed Classes":

O recurso de "unnamed classes" (classes sem nome) no Java 21 é uma preview feature (funcionalidade de pré-visualização). Isso significa que, por padrão, o compilador não deveria usá-la a menos que seja explicitamente ativada.

O erro que você está a receber sugere que o compilador está a ser invocado com a flag de preview ativada (ex: --enable-preview). Ao desativar as preview features nas propriedades do projeto, você está a dizer ao NetBeans para compilar o seu código Java 21 de forma "padrão", onde classes nomeadas com pacotes são o comportamento esperado e permitido.

Se todas as tentativas acima falharem, o problema pode estar numa configuração mais profunda do NetBeans ou no seu ambiente. Mas estas duas abordagens são as mais prováveis para resolver o seu caso.

Obrigado por partilhar o novo log! Esta é uma mensagem de erro diferente e muito útil, que nos dá uma pista exata do que está a acontecer:

error: invalid source release 20 with --enable-preview (preview language features are only supported for release 21) BUILD FAILED (total time: 0 seconds)

Diagnóstico:

Esta mensagem significa que você está a tentar compilar seu código com:

  • --enable-preview: A flag para ativar as preview features do Java.
  • source release 20: Mas está a dizer ao compilador que o código fonte é para a versão 20 do Java.

O problema é que as preview features que o compilador encontrou (provavelmente algo relacionado com "unnamed classes" ou "record patterns", etc.) só estão disponíveis na versão 21 do Java quando a flag --enable-preview é usada. Elas não existiam ou eram diferentes na versão 20.

Em outras palavras, você tem uma mistura de configurações:

  • Seu projeto está configurado para usar o JDK 21 para compilação (pelo menos as preview features).
  • Mas a source release (o nível de compatibilidade do código-fonte) está definida para Java 20.

Solução:

Você tem duas opções principais para resolver isso, dependendo do que você realmente quer fazer:

Opção 1: Mudar o projeto para usar a versão 21 como source release (Se você quer usar as preview features do Java 21)

  1. No NetBeans, clique com o botão direito no seu projeto SistemaGestaoHoteleiro.

  2. Selecione "Properties" (Propriedades).

  3. Vá para a categoria "Sources" (Fontes).

  4. No campo "Source/Binary Format" (Formato Fonte/Binário), certifique-se de que está selecionado "JDK 21".

    • Se ainda vir "JDK 20" ou outro, mude para "JDK 21".
    • Certifique-se de que a caixa "Enable Preview Language Features" (ou similar) ESTÁ MARCADA se você pretende usar qualquer funcionalidade de pré-visualização. Se não estiver marcada, e você está a ter este erro, é porque o NetBeans está a tentar habilitá-las implicitamente ou há algo no seu código que o NetBeans pensa que é uma preview feature (como as unnamed classes, que podem ser interpretadas se o seu ficheiro TelaCadastro.java tiver algum problema de formatação na primeira linha).
  5. Clique em "OK".

  6. Faça um "Clean and Build" completo no seu projeto.

Opção 2: Desativar as preview features e usar uma versão estável (Recomendado na maioria dos casos para aplicações desktop Swing)

A menos que você esteja a programar algo muito específico que exija as preview features do Java 21, é mais simples e estável desativá-las e usar uma versão LTS (Long-Term Support) como o Java 17, ou mesmo o Java 21 sem as preview features.

  1. No NetBeans, clique com o botão direito no seu projeto SistemaGestaoHoteleiro.
  2. Selecione "Properties" (Propriedades).
  3. Vá para a categoria "Sources" (Fontes).
  4. No campo "Source/Binary Format" (Formato Fonte/Binário):
    • Mude para "JDK 17" ou "JDK 20". (Se você não tem essas plataformas instaladas/registradas no NetBeans, precisará fazê-lo primeiro via Tools -> Java Platforms.)
    • MUITO IMPORTANTE: Desmarque a caixa "Enable Preview Language Features" (ou similar) se ela estiver visível e marcada.
  5. Clique em "OK".
  6. Faça um "Clean and Build" completo no seu projeto.

Resumo da Situação:

O erro anterior (unnamed class should not have package declaration) e este novo (invalid source release 20 with --enable-preview) estão ambos ligados à forma como o seu NetBeans está a invocar o compilador do Java 21 com as preview features.

O NetBeans é conhecido por, por vezes, configurar ligeiramente mal as flags de compilação, ou a interação entre o Ant e o JDK pode estar a causar esta incompatibilidade. A melhor aposta é garantir que a "Source/Binary Format" e a opção de "Preview Features" estão alinhadas com o que você realmente quer:

  • Se quer Java 21 com Preview Features: Source/Binary Format = JDK 21, Preview Features = ON.
  • Se quer uma aplicação Java padrão (Recomendado): Source/Binary Format = JDK 17/20/21, Preview Features = OFF.

Por favor, tente uma das opções, com prioridade para a Opção 2, e depois faça um Clean and Build novamente.

Ah, que pena! Então voltamos ao erro original:

error: unnamed class should not have package declaration package telas; Note: /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadastro.java uses preview features of Java SE 21.

Isso sugere que, apesar das suas tentativas de ajustar as configurações, o compilador ainda está a ser invocado com --enable-preview para o Java 21, ou está a interpretar o seu ficheiro como uma "unnamed class" mesmo sem essa flag devido a alguma peculiaridade.

Vamos tentar abordar isso de forma mais agressiva na configuração do NetBeans, garantindo que não há ambiguidade sobre o nível de linguagem e as funcionalidades de pré-visualização.

Vamos tentar o seguinte, passo a passo e com foco em cada detalhe:

  1. Fechar NetBeans Completamente:

    • Certifique-se de que o NetBeans está completamente fechado. Isso limpa quaisquer estados de projeto em memória.
  2. Verificar a Plataforma Java Instalada e Padrão no NetBeans:

    • Abra o NetBeans.
    • Vá para Tools (Ferramentas) -> Java Platforms (Plataformas Java).
    • Veja quais JDKs estão listados e qual está marcado como padrão. Idealmente, você deve ter um JDK 17 ou 21 completo e funcional aqui.
    • Se você tiver várias versões, pode ser útil definir uma versão estável (como JDK 17) como padrão.
    • Se não tiver o JDK 17 ou 20, considere instalá-lo e adicioná-lo aqui.
  3. Remover e Adicionar Novamente o Projeto (Medida Drástica, mas eficaz para limpar configs):

    • No painel "Projects" (Projetos) do NetBeans, clique com o botão direito no seu projeto SistemaGestaoHoteleiro.
    • Selecione "Close" (Fechar) ou "Unload Project" (Descarregar Projeto).
    • Agora, vá para File (Ficheiro) -> Open Project (Abrir Projeto) e navegue até a pasta SistemaGestaoHoteleiro e abra-o novamente.
    • Isso força o NetBeans a reler as configurações do projeto do zero.
  4. Verificação Dupla das Propriedades do Projeto (Agora com o projeto recém-carregado):

    • Clique com o botão direito no projeto SistemaGestaoHoteleiro no NetBeans.

    • Selecione "Properties" (Propriedades).

    • a) Categoria "Sources" (Fontes):

      • "Source/Binary Format" (Formato Fonte/Binário):
        • Mude para "JDK 17" (se disponível e preferível para estabilidade) ou "JDK 21" (se você realmente precisar dos recursos mais recentes, mas sem preview features).
      • "Enable Preview Language Features" (ou similar):
        • DESMARQUE esta caixa. Esta é a principal culpada. Se ela não estiver visível aqui, procure nas categorias "Build" -> "Compiling". O objetivo é NUNCA ter esta opção marcada para a sua aplicação Swing normal.
    • b) Categoria "Libraries" (Bibliotecas):

      • Verifique se a "Java Platform" aqui corresponde à versão que você selecionou em "Sources". Se escolheu JDK 17, garanta que está JDK 17 aqui também.
    • c) Categoria "Build" -> "Compiling" (Compilando):

      • Procure por quaisquer opções que possam influenciar a linha de comando do compilador (javac) ou que mencionem "language level" ou "preview".
      • Certifique-se de que não há nenhuma configuração personalizada que adicione a flag --enable-preview. Se houver uma caixa de seleção "Enable preview features", desmarque-a aqui também.
    • Clique em "OK" para aplicar todas as mudanças.

  5. Faça um "Clean and Build" Novamente (Extremamente Importante):

    • Clique com o botão direito no projeto SistemaGestaoHoteleiro.
    • Selecione "Clean and Build".
  6. Verificar o Ficheiro build.xml (Se tudo mais falhar):

    • Em casos muito persistentes, as configurações do NetBeans podem não estar a ser gravadas corretamente no ficheiro build.xml (o script Ant que o NetBeans usa para compilar).
    • No painel "Projects", expanda o seu projeto, depois "build.xml" e clique duas vezes nele para abrir.
    • Procure por linhas que contenham javac e observe os atributos source, target e se há alguma menção de --enable-preview.
    • Exemplo de como deveria ser (para JDK 17):
      XML
      <javac srcdir="${src.dir}" destdir="${build.classes.dir}" ... source="17" target="17" ...>
          ...
      </javac>
      
    • Se vir algo como source="21" --enable-preview e você não quer isso, o NetBeans deveria corrigir isso automaticamente nas propriedades, mas se não corrigir, você pode ter que editar manualmente aqui (com cautela, pois o NetBeans pode sobrescrever). Mas primeiro, tente as opções GUI acima.

Este erro persistente de unnamed class é quase sempre causado por uma configuração de compilação que ativa as preview features do Java 21 de forma indesejada. Vamos tentar ser o mais metódicos possível para garantir que essa configuração é desativada ou que o ambiente está perfeitamente alinhado.

Ótimo! Entendi. Você "apagou" o código e o colou novamente, agora com um main method simples e sem os componentes da GUI ainda.

Este novo código para TelaCadastro.java está perfeito em termos de estrutura básica para uma classe JFrame com um logger e um método main. Não vejo nenhum erro de sintaxe imediato aqui.

O fato de o NetBeans ter gerado este código mais simples após você "apagar e fazer de novo" (presumo que você criou um novo JFrame Form ou copiou um template básico) é um bom sinal, pois ele deve estar mais limpo.

Agora, o que precisamos fazer é o seguinte, passo a passo:

  1. Salvar o Ficheiro:

    • Certifique-se de que este novo código que você me enviou está salvo no ficheiro TelaCadastro.java dentro do NetBeans.
  2. Verificação Final das Propriedades do Projeto:

    • É crucial garantir que a configuração de compilação do seu projeto não está a habilitar as "preview features" do Java 21 inadvertidamente.

    • No NetBeans, clique com o botão direito no seu projeto SistemaGestaoHoteleiro.

    • Selecione "Properties" (Propriedades).

    • Vá para a categoria "Sources" (Fontes).

    • Certifique-se de que a caixa "Enable Preview Language Features" (Ativar Recursos de Pré-visualização) está DESMARCADA. (Se não a encontrar aqui, procure em "Build" -> "Compiling").

    • No campo "Source/Binary Format" (Formato Fonte/Binário), defina para "JDK 17" ou "JDK 21". A escolha entre 17 e 21 (sem preview) não deve dar o erro unnamed class, mas o 17 é mais "seguro" em termos de compatibilidade de ferramentas.

    • Se você está usando o NetBeans 17 ou mais recente e o JDK 21, geralmente o NetBeans configura isso automaticamente para "JDK 21" e a opção de preview desmarcada para projetos padrão. O problema é quando essa opção fica marcada por algum motivo.

  3. Clean and Build (Limpar e Construir):

    • Esta é a etapa mais importante. No NetBeans, clique com o botão direito no seu projeto SistemaGestaoHoteleiro.
    • Selecione "Clean and Build" (Limpar e Construir).
  4. Execute o Projeto:

    • Tente executar o projeto.

O que esperamos agora:

Se as configurações do projeto estiverem corretas (principalmente "Enable Preview Language Features" desmarcada), este código simplificado de TelaCadastro.java deve compilar e executar sem o erro unnamed class should not have package declaration.

Se o erro ainda assim persistir, então há algo mais profundo a acontecer com a sua instalação do NetBeans ou do JDK que está a forçar a flag --enable-preview no processo de compilação, mesmo quando você tenta desativá-la.

Se o erro retornar mesmo após os passos acima, por favor, me diga exatamente qual é a mensagem de erro novamente (porque já vimos dois tipos diferentes).

Vamos um passo de cada vez. Com este código base, a próxima compilação deve ser limpa.

oque tinha na tela cadatro vamos fazer de novo

Compreendo! Você quer retomar o código completo da TelaCadastro.java com todos os componentes da GUI e validações que tínhamos antes, e então resolver o erro de compilação.

Certo. O problema que estamos a enfrentar (unnamed class should not have package declaration) é sobre a forma como o compilador está a interpretar o seu ficheiro, e não sobre o conteúdo específico da sua GUI. No entanto, ter o código completo é importante para garantir que estamos a depurar a versão correta.

Por favor, cole aqui o código COMPLETO e ATUAL da sua TelaCadastro.java, com todos os componentes Swing e as validações que você tinha.

Assim que você o colar, vamos repetir os passos para tentar resolver o problema de compilação da "unnamed class", focando nas configurações do NetBeans.

Estou pronto para quando você colar o código.

vamos por todos os componetes em uma nova telacadatro

Compreendido! A melhor abordagem será recriar o TelaCadastro.java a partir do zero no NetBeans e depois colar o código dos componentes e validações. Isso garante que o NetBeans gere os cabeçalhos de ficheiro e as configurações iniciais corretamente.

Passos para fazer isso no NetBeans:

  1. Apague o seu ficheiro TelaCadastro.java atual:

    • No painel "Projects" (Projetos) do NetBeans, navegue até Source Packages -> telas.
    • Clique com o botão direito em TelaCadastro.java.
    • Selecione "Delete" (Apagar). Confirme a exclusão.
  2. Crie um novo JFrame Form com o mesmo nome e pacote:

    • Clique com o botão direito na pasta telas (dentro de Source Packages).
    • Selecione "New" (Novo) -> "JFrame Form...".
    • Na janela "New JFrame Form":
      • Class Name (Nome da Classe): Digite TelaCadastro (exatamente como antes).
      • Package (Pacote): Certifique-se de que está telas.
    • Clique em "Finish" (Concluir).

    O NetBeans agora criará um novo ficheiro TelaCadastro.java com o código básico de um JFrame, incluindo o package telas; e o initComponents(). Este ficheiro estará limpo e gerado corretamente.

  3. Abra o novo TelaCadastro.java no NetBeans na aba "Source".

  4. Copie e cole o código dos componentes e validações:

    • Agora, cole o código completo da sua TelaCadastro.java anterior (com todos os JTextField, JLabel, JButton e as lógicas de validação dentro dos métodos initComponents(), btnAdicionarActionPerformed, etc.).
    • Substitua todo o conteúdo do ficheiro gerado pelo NetBeans pelo código que você tinha antes, MAS COM UMA EXCEÇÃO CRÍTICA:
      • NÃO cole a parte /* até */ dos comentários gerados pelo NetBeans. Mantenha os comentários que o NetBeans acabou de gerar no novo ficheiro.
      • MANTENHA a linha package telas; gerada pelo NetBeans no topo.
      • MANTENHA a estrutura básica da classe e do método main que o NetBeans gera.
      • Cole o restante do seu código (declarações de variáveis, o conteúdo de initComponents(), o btnAdicionarActionPerformed e outros métodos de ação) APÓS a linha que o NetBeans gera: public class TelaCadastro extends javax.swing.JFrame {.

    É fundamental que a linha package telas; e os comentários gerados pelo NetBeans permaneçam intactos no topo do ficheiro, e que o resto do seu código se encaixe na estrutura gerada.

Se você tiver dificuldade em "encaixar" o código, me avise. Posso tentar guiá-lo mais especificamente. Mas, em geral, o que você vai copiar é:

  • As importações que você tinha (java.time.LocalDate, etc.)
  • A declaração do logger (private static final java.util.logging.Logger logger = ...)
  • O conteúdo do seu método initComponents() (tudo entre private void initComponents() { e }// </editor-fold>)
  • Os seus métodos de ação (btnAdicionarActionPerformed, btnExcluirActionPerformed, etc.)
  • A parte Variables declaration (embora o NetBeans geralmente recrie isso).

Depois de colar o código:

  1. Salve o ficheiro.
  2. Faça um "Clean and Build" no seu projeto (SistemaGestaoHoteleiro).
  3. Tente executar a aplicação.

Ao recriar o ficheiro dessa forma, estamos a tentar eliminar qualquer corrupção sutil ou configuração oculta que possa estar a causar o erro unnamed class no ficheiro anterior. O NetBeans é bastante particular com o código que ele gera e espera, especialmente nas primeiras linhas.

ja esta e depois

Muito bem! Se você já recriou o TelaCadastro.java seguindo os passos que descrevi, e colou o código completo dos componentes e validações, então o próximo passo é crucial:

1. Salvar o Ficheiro:

  • No NetBeans, certifique-se de que TelaCadastro.java está salvo. (Normalmente, um asterisco * ao lado do nome do ficheiro na aba indica que há alterações não salvas).

2. Faça um "Clean and Build" (Limpar e Construir) no seu projeto:

  • Esta é a etapa mais importante para garantir que o NetBeans recompila tudo do zero e com as configurações mais recentes.
  • No painel "Projects" (Projetos) do NetBeans, clique com o botão direito no seu projeto principal (SistemaGestaoHoteleiro).
  • Selecione "Clean and Build".
  • Observe atentamente a janela "Output" (Saída) do NetBeans para ver o resultado da compilação.

3. Verifique o resultado no "Output" (Saída):

  • Se a compilação for bem-sucedida (ideal): Você deverá ver BUILD SUCCESSFUL na janela de saída. Isso significa que o erro de "unnamed class" foi resolvido!

    • Nesse caso, tente executar o seu projeto para ver se a TelaCadastro aparece corretamente.
  • Se o erro "unnamed class should not have package declaration" retornar:

    • Por favor, copie e cole o log completo da janela "Output" novamente. Precisamos ver se algo na sua configuração do NetBeans ainda está a forçar essa "preview feature".
  • Se surgir um NOVO erro:

    • Copie e cole o novo erro completo. Poderá ser um erro de importação, ou um método faltando, algo que aconteceu durante o "copiar e colar" do código anterior para o novo.

Estamos a caminhar. O objetivo principal agora é fazer o projeto compilar sem o erro de "unnamed class".

nao tem erro , so estou a por os componetes que tinha anteriormente nessa

Fantástico! Isso é uma excelente notícia!

Se não tem erro na compilação após o "Clean and Build", significa que o problema do unnamed class should not have package declaration foi finalmente resolvido ao recriar o TelaCadastro.java a partir do template do NetBeans e colar o seu código. Isso é um grande avanço!

Agora, o que você está a fazer é o próximo passo lógico: recolocar todos os componentes da GUI (JTextFields, JLabels, JButtons, etc.) e o respetivo código de lógica e validação que você tinha anteriormente nesta nova TelaCadastro que já compila.

Como proceder:

  1. Use o NetBeans GUI Builder (Design View):

    • Abra TelaCadastro.java no NetBeans.
    • Clique na aba "Design" (ao lado de "Source").
    • Utilize a paleta de componentes (Palette, geralmente no lado direito) para arrastar e soltar os JTextField, JLabel, JButton, JRadioButton, JTextArea, JScrollPane (para o JTextArea) e outros elementos que você tinha no seu layout.
    • Posicione-os e ajuste o tamanho como você tinha antes.
  2. Copiar o Código dos Métodos de Ação e Validação:

    • Volte para a aba "Source" do TelaCadastro.java.
    • Você precisará copiar o código que você tinha anteriormente para dentro dos métodos corretos.
      • O conteúdo do initComponents() (tudo o que define as propriedades e o layout dos componentes) já deve ter sido gerado ou você já o colou.
      • Copie os métodos como btnAdicionarActionPerformed, btnAtualizarActionPerformed, btnExcluirActionPerformed, jTextField1ActionPerformed, jTextField2ActionPerformed, etc., e cole-os dentro da classe TelaCadastro.
      • As validações que você tinha anteriormente estavam principalmente dentro do btnAdicionarActionPerformed. Certifique-se de que todo esse código é copiado para dentro do método correspondente.
      • As importações (import java.time.LocalDate; etc.) que estavam no código anterior também devem ser copiadas para o topo do ficheiro, abaixo da linha package telas;.
  3. Renomear Variáveis (Importante se você não colou tudo de uma vez):

    • À medida que você adiciona componentes pelo Design View, o NetBeans pode dar nomes padrão (ex: jTextField1, jLabel1). Certifique-se de que os nomes das variáveis nos seus métodos de ação (jTextField8, jTextField2, txtObservacoes, jRadioButton1, jRadioButton2, etc.) correspondem aos nomes dos componentes que você adicionou no Design View. Você pode renomear os componentes no Design View (clique direito no componente -> Change Variable Name) para que correspondam aos nomes que você já tinha no seu código.
  4. Após cada bloco de componentes/código que adicionar:

    • Salve o ficheiro.
    • Faça um "Clean and Build" no projeto. Isso é uma boa prática para identificar erros cedo, em vez de acumular muitos erros de uma vez.

Se tiver dificuldade ou encontrar algum erro durante este processo, cole o código ou a mensagem de erro aqui, e eu ajudo a resolver.

O facto de a compilação base estar a funcionar é um ótimo sinal. Agora é apenas reconstruir a GUI e a lógica, certificando-se de que tudo se encaixa corretamente.

quais componetes tinha

Excelente pergunta! Para saber exatamente quais componentes você tinha e como eles estavam conectados, vou precisar daquele código da TelaCadastro.java que você me enviou anteriormente, o código completo com todos os componentes Swing e as validações, antes de o ter simplificado.

Eu tinha o código da TelaCadastro.java que você me enviou no dia 17 de Junho, que incluía:

Componentes (pelas declarações de variáveis e initComponents):

  • javax.swing.JScrollPane (provavelmente jScrollPane1 e jScrollPaneObservacoes)
  • javax.swing.JPanel (painelPrincipalCadastro)
  • javax.swing.JLabel (vários, como txCadastroHóspedes, txNomeCompleto, txNºBilhete, txDataNasc, txTelefone, txEmail, txNacionalidade, txEndereco, lbSexo, txObservações, txID, Logo)
  • javax.swing.JRadioButton (jRadioButton1, jRadioButton2 para Sexo)
  • javax.swing.JTextField (muitos, como jTextField1, jTextField2, jTextField3, jTextField4, jTextField5, jTextField6, jTextField11, jTextField8)
  • javax.swing.JTextArea (txtObservacoes)
  • javax.swing.JButton (vários, como btnAdicionar, btnAtualizar, btnExcluir, bnLimparNome, bnLimparBilhete, bnLimparDataNAsc, bnEmailLimpar, bnLimparEndereco, bnsexoLimpar, bnLimparTelefone, bnLimparNacional, jButton9, jButton1)

Além dos componentes, havia também a lógica nos métodos:

  • public TelaCadastro() (construtor, que chamava initComponents())
  • private void initComponents() (onde todos os componentes eram inicializados, suas propriedades definidas e o layout organizado)
  • private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) (com todas as suas validações detalhadas para ID, Nome Completo, Nº Bilhete, Data de Nascimento, Email, Endereço, Telefone, Nacionalidade, Sexo e Observações)
  • private void btnExcluirActionPerformed(java.awt.event.ActionEvent evt) (estava vazio)
  • private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) (estava vazio)
  • private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) (estava vazio)
  • private void btnAtualizarActionPerformed(java.awt.event.ActionEvent evt) (estava vazio)
  • public static void main(String args[]) (o método principal para iniciar a aplicação)

Para a próxima vez, se você estiver a reconstruir a GUI no NetBeans Design View, aqui está uma lista dos JTextFields e JLabels com os quais você estava a trabalhar, baseando-me nas validações do seu código btnAdicionarActionPerformed:

  • JLabel: txID (associado a jTextField8)
  • JLabel: txNomeCompleto (associado a jTextField2)
  • JLabel: txNºBilhete (associado a jTextField3)
  • JLabel: txDataNasc (associado a jTextField1)
  • JLabel: txEmail (associado a jTextField4)
  • JLabel: txEndereco (associado a jTextField5)
  • JLabel: txTelefone (associado a jTextField6)
  • JLabel: txNacionalidade (associado a jTextField11)
  • JLabel: lbSexo (associado a jRadioButton1 e jRadioButton2)
  • JLabel: txObservações (associado a txtObservacoes)

Você pode usar o NetBeans GUI Builder para arrastar esses componentes, nomeá-los (clique direito no componente -> Change Variable Name) com os nomes acima (ex: jTextField8, jTextField2, jRadioButton1, etc.) e depois colar a lógica de validação e os eventos.

Se você tiver o código completo anterior salvo em algum lugar, seria muito útil colá-lo aqui novamente para que eu possa verificar tudo e garantir que não perdemos nada.

tem como fazer algo assim mas sem profissoa e esas linhas___ nao esuqeca que o meu é desktop e nao algo manual em papel

看起來您想將您的桌面應用程式的 TelaCadastro 介面設計得類似您在圖片中看到的「CADASTRO DE HÓSPEDES」表單,但希望移除「Profissão」和那些水平線,並且明確這是在桌面應用程式中實現,而不是紙本表單。

好的,這完全可以做到。您可以使用 NetBeans 的 GUI 設計器來創建類似的佈局。以下是如何操作的步驟和一些建議:

1. 使用 NetBeans GUI 設計器創建組件:

  • 打開您的 TelaCadastro.java 文件,切換到 "Design" 視圖。
  • "Palette"(通常在右側)拖放所需的 Swing 組件到您的表單上。您可能需要以下組件:
    • JLabel: 用於顯示標籤,例如 "Check-in", "Horário", "Nome", "Data de Nascimento", "Endereço", "Telefone", "E-mail" 等。
    • JTextField: 用於讓使用者輸入文字信息。每個標籤都需要一個對應的 JTextField
    • JComboBox: 如果您有固定的選項(例如 "Tipo de acomodação"),可以使用下拉選單。
    • JRadioButton: 如果使用者需要在幾個互斥的選項中選擇一個(例如圖片中的 "Motivo da viagem"),可以使用單選按鈕。
    • JCheckBox: 如果使用者可以選擇多個選項(例如圖片中的 "Meio de transporte"),可以使用複選框。
    • JButton: 用於 "Check-out" 或 "Guardar" 等按鈕。

2. 佈局管理 (Layout Managers):

  • NetBeans 提供了不同的佈局管理器來幫助您組織組件。對於這種表單式的佈局,GridBagLayoutMigLayout 通常非常適合,因為它們允許您精確地控制組件在網格中的位置和大小。
  • 您可以通過在設計視圖中右鍵單擊表單的空白區域,然後選擇 "Set Layout" 來更改佈局管理器。
  • 如果您是初學者,GroupLayout 是 NetBeans 的預設佈局管理器,雖然對於複雜的佈局可能不太靈活,但也可以嘗試使用。

3. 調整組件屬性:

  • 選擇表單上的每個組件,然後在 "Properties" 視窗(通常在右下角)中調整其屬性:
    • text: 更改 JLabelJButton 上顯示的文字。清除 JTextField 的預設文字。
    • font: 更改文字的字體、大小和樣式。
    • border: 您可以移除或更改組件的邊框。
    • horizontalAlignment / verticalAlignment: 調整標籤內文字的對齊方式。

4. 移除 "Profissão":

  • 直接不要在您的表單中添加對應 "Profissão" 的 JLabelJTextField

5. 移除水平線:

  • 圖片中的水平線很可能是通過在表單上添加非常窄且長的 JPanel 組件,並設置其背景顏色來實現的。
  • 要在您的桌面應用程式中移除這些線條,只需不要添加這些 JPanel 組件即可。您可以使用佈局管理器的間距或組件的邊框屬性來創建視覺上的分隔。

6. 實現桌面應用程式的行為:

  • 這是與紙本表單的主要區別。您需要為您的表單添加事件處理器,以便在使用者與組件互動時執行程式碼:
    • 例如,當使用者在 JTextField 中輸入文字或點擊 JButton 時。
    • 您可以在 NetBeans 設計視圖中選擇組件,然後在 "Events" 視窗中為所需的事件(例如 ActionListener for buttons, KeyListener for text fields)添加事件處理方法。
    • 在這些事件處理方法中,您可以編寫程式碼來獲取使用者輸入的數據、進行驗證、將數據保存到您的應用程式邏輯中等等。

7. 保持您的桌面風格:

  • 確保您使用的 Swing 組件和整體外觀符合您桌面應用程式的風格。您可以通過更改應用程式的 Look and Feel 來調整整體外觀。

總結步驟:

  1. 在 NetBeans GUI 設計器中創建所需的 JLabelJTextFieldJComboBoxJRadioButtonJCheckBoxJButton 組件。
  2. 使用合適的佈局管理器(例如 GridBagLayoutMigLayout)來組織這些組件,使其看起來像您提供的圖片,但不包含 "Profissão" 和水平線
  3. 調整每個組件的 "text" 和其他屬性以符合您的需求。
  4. 為需要的組件添加事件處理器以實現您的應用程式邏輯(例如,點擊 "Guardar" 按鈕時保存數據)。
  5. 進行 "Clean and Build" 並運行您的應用程式以查看結果。

如果您在實現特定的佈局或移除水平線方面遇到困難,請告訴我您正在使用的佈局管理器以及您嘗試過的操作,我可以提供更具體的指導。

em portugues

Mil desculpas! Assumi o idioma errado na minha resposta anterior. Vamos refazer em Português.

Compreendi perfeitamente! Você quer projetar a interface TelaCadastro do seu aplicativo de desktop para ser semelhante ao formulário "CADASTRO DE HÓSPEDES" que você mostrou na imagem, mas com as seguintes modificações:

  • Remover o campo "Profissão".
  • Remover as linhas horizontais.
  • E, claro, reiterar que isso é para uma aplicação de desktop, não para um formulário em papel.

Sim, isso é totalmente possível de fazer usando o construtor de GUI do NetBeans. Veja como pode proceder:

1. Use o Construtor de GUI do NetBeans para adicionar os componentes:

  • Abra o seu ficheiro TelaCadastro.java e mude para a aba "Design" (Design).
  • Na paleta de componentes (Palette, geralmente no lado direito), arraste e solte os componentes Swing necessários para o seu formulário. Você provavelmente precisará de:
    • JLabel: Para exibir os rótulos de texto, como "Check-in", "Horário", "Nome", "Data de Nascimento", "Morada", "Telefone", "E-mail", etc.
    • JTextField: Para permitir que o utilizador digite informações de texto. Cada rótulo de entrada precisará de um JTextField correspondente.
    • JComboBox: Se tiver opções fixas para escolher (por exemplo, "Tipo de alojamento"), pode usar uma caixa de combinação (dropdown).
    • JRadioButton: Se o utilizador precisar selecionar uma opção exclusiva entre várias (como "Motivo da viagem" na imagem), use botões de rádio.
    • JCheckBox: Se o utilizador puder selecionar múltiplas opções (como "Meio de transporte" na imagem), use caixas de seleção.
    • JButton: Para botões como "Check-out" ou "Guardar".
    • JScrollPane e JTextArea: Se precisar de uma área de texto para observações mais longas.

2. Gestão do Layout (Layout Managers):

  • O NetBeans oferece diferentes gestores de layout para o ajudar a organizar os componentes. Para este tipo de formulário, o GridBagLayout ou o MigLayout são geralmente muito adequados, pois permitem um controlo preciso da posição e tamanho dos componentes numa grelha.
  • Pode mudar o gestor de layout clicando com o botão direito na área em branco do seu formulário na vista de design e selecionando "Set Layout".
  • Se for iniciante, o GroupLayout é o gestor de layout padrão do NetBeans, e embora possa ser menos flexível para layouts complexos, pode ser um bom ponto de partida.

3. Ajustar as Propriedades dos Componentes:

  • Selecione cada componente no seu formulário e, na janela "Properties" (Propriedades, geralmente no canto inferior direito), ajuste as suas propriedades:
    • text: Altere o texto exibido em JLabels ou JButtons. Limpe o texto padrão dos JTextFields.
    • font: Altere a fonte, tamanho e estilo do texto.
    • border: Pode remover ou alterar a borda dos componentes.
    • horizontalAlignment / verticalAlignment: Ajuste o alinhamento do texto dentro dos rótulos.

4. Remover "Profissão":

  • Simplesmente não adicione um JLabel ou um JTextField correspondente a "Profissão" no seu formulário.

5. Remover as Linhas Horizontais:

  • As linhas horizontais na imagem são provavelmente pequenos JPanels ou JSeparators com uma cor de fundo definida para parecer uma linha.
  • Para removê-las na sua aplicação de desktop, basta não adicionar esses componentes. Pode usar o espaçamento do gestor de layout ou as propriedades de borda dos componentes para criar separações visuais se desejar, mas sem a aparência de uma linha.

6. Implementar o Comportamento da Aplicação Desktop:

  • Esta é a principal diferença de um formulário em papel. Você precisará adicionar manipuladores de eventos aos seus componentes para que o código seja executado quando o utilizador interagir com eles:
    • Por exemplo, quando o utilizador digita num JTextField ou clica num JButton.
    • No NetBeans Design View, pode selecionar um componente e, na janela "Events" (Eventos), adicionar um método de tratamento para o evento desejado (por exemplo, ActionListener para botões, KeyListener para campos de texto).
    • Dentro desses métodos de evento, você escreverá o código para obter os dados digitados pelo utilizador, realizar validações, salvar os dados na sua lógica de aplicação, etc.

7. Manter o Estilo Desktop:

  • Certifique-se de que os componentes Swing que usa e a aparência geral correspondem ao estilo da sua aplicação desktop. Pode ajustar a aparência geral da aplicação alterando o Look and Feel.

Resumo dos passos:

  1. No construtor de GUI do NetBeans, adicione os JLabel, JTextField, JComboBox, JRadioButton, JCheckBox e JButton necessários.
  2. Use um gestor de layout adequado (como GridBagLayout ou MigLayout) para organizar os componentes de forma semelhante à imagem, mas sem o campo "Profissão" e sem as linhas horizontais.
  3. Ajuste as propriedades (text, font, etc.) de cada componente.
  4. Para o campo "Profissão" e as linhas, simplesmente não os inclua no seu design.
  5. Adicione manipuladores de eventos aos seus botões e campos de entrada para implementar a lógica da sua aplicação (validação, guardar dados, etc.).
  6. Faça um "Clean and Build" e execute a sua aplicação para ver o resultado.

Se tiver dificuldades em implementar um layout específico ou em remover as linhas, diga-me qual gestor de layout está a usar e o que já tentou, para que eu possa dar instruções mais específicas.

eu quero passo a passo

Perfeito! Vamos fazer isso passo a passo, focando em criar a interface no NetBeans com os componentes que você precisa e removendo o que não quer, tudo no seu projeto desktop.

Estou a assumir que você já tem o seu projeto SistemaGestaoHoteleiro aberto no NetBeans e que o ficheiro TelaCadastro.java já foi criado novamente e está vazio ou com o código base gerado pelo NetBeans, sem erros de compilação.


Passo a Passo para Desenhar a Tela de Cadastro de Hóspedes (Parte 1: Componentes Principais)

Objetivo: Adicionar os principais campos de texto e rótulos para a tela de cadastro, excluindo "Profissão" e as linhas.

  1. Abrir TelaCadastro.java no NetBeans:

    • No painel Projects (Projetos) à esquerda, navegue até SistemaGestaoHoteleiro -> Source Packages -> telas.
    • Dê um clique duplo em TelaCadastro.java.
    • Certifique-se de que está na aba Design (Design) no topo da janela principal. Esta é a vista onde você arrasta e solta os componentes.
  2. Preparar o Painel Principal (Opcional, mas recomendado para organização):

    • Se o seu formulário já tem um JPanel padrão (geralmente ele vem com um getContentPane()), pode usá-lo. Se não, é uma boa prática adicionar um JPanel para agrupar tudo.
    • Na Palette (Paleta, geralmente no lado direito), encontre Swing Containers e arraste um JPanel para o centro do seu JFrame (a área cinzenta do formulário).
    • Pode renomear este painel para algo como painelPrincipalCadastro (clique direito no painel -> Change Variable Name...).
  3. Definir o Layout do Painel Principal:

    • Com o seu JPanel (ou o JFrame diretamente, se não usou um painel extra) selecionado, clique com o botão direito nele.
    • Vá em Set Layout (Definir Layout).
    • Sugiro escolher Free Design (Design Livre) para começar, ou Grid Bag Layout se quiser mais controlo e alinhamento desde o início. Para este guia, vamos assumir o Free Design para a flexibilidade de arrastar e soltar.
  4. Adicionar o Título da Tela:

    • Na Palette, em Swing Controls, arraste um JLabel para o topo do seu painel.
    • Com o JLabel selecionado, vá para a janela Properties (Propriedades, geralmente no canto inferior direito).
    • Encontre a propriedade text e mude-a para: "CADASTRO DE HÓSPEDES".
    • Pode ajustar a fonte para ficar maior e em negrito (clique no botão ... ao lado de font).
  5. Adicionar os Campos de Check-in e Horário:

    • Arraste dois JLabels.
      • Primeiro JLabel: Mude o text para "Check-in:".
      • Segundo JLabel: Mude o text para "Horário:".
    • Arraste dois JTextFields. Posicione um ao lado de cada JLabel correspondente.
    • Sugiro renomear as variáveis dos JTextFields para algo descritivo, por exemplo:
      • JTextField do Check-in: txtCheckin (clique direito no JTextField -> Change Variable Name...).
      • JTextField do Horário: txtHorario
  6. Adicionar os Campos de Dados Pessoais (Nome, Data Nasc., Morada, Telefone, E-mail):

    • Repita o processo:
      • Arraste um JLabel para cada rótulo (Nome Completo:, Data de Nascimento:, Morada:, Telefone:, E-mail:).
      • Arraste um JTextField para cada campo de entrada correspondente.
      • Posicione-os um abaixo do outro, como no seu design.
      • Renomeie as variáveis dos JTextFields para algo como:
        • txtNomeCompleto
        • txtDataNascimento
        • txtMorada
        • txtTelefone
        • txtEmail
      • Importante: Para os JTextFields, selecione-os e, nas Properties, apague o conteúdo da propriedade text (deixe-a vazia) para que não apareçam com "jTextField1", "jTextField2", etc.
  7. Adicionar Campo de Nacionalidade:

    • Arraste um JLabel: text para "Nacionalidade:".
    • Arraste um JTextField: renomeie para txtNacionalidade. Apague o text padrão.
  8. Adicionar os Botões de Sexo (Masculino/Feminino):

    • Arraste um JLabel: text para "Sexo:".
    • Arraste dois JRadioButtons (de Swing Controls).
      • Primeiro JRadioButton: Mude o text para "Masc.". Renomeie a variável para radioMasc.
      • Segundo JRadioButton: Mude o text para "Fem.". Renomeie a variável para radioFem.
    • Agrupar os Radio Buttons:
      • Na Palette, em Swing Controls, encontre ButtonGroup.
      • Arraste um ButtonGroup para qualquer lugar no formulário. Ele não é um componente visual, apenas lógico.
      • Renomeie a variável do ButtonGroup para buttonGroupSexo.
      • Agora, selecione radioMasc, vá em Properties, encontre a propriedade buttonGroup e selecione buttonGroupSexo na lista.
      • Faça o mesmo para radioFem. Isso garante que apenas um possa ser selecionado por vez.
  9. Adicionar o Campo de Observações:

    • Arraste um JLabel: text para "Observações:".
    • Arraste um JTextArea (de Swing Controls). Renomeie para txtObservacoes. Apague o text padrão.
    • Importante: Para JTextAreas que podem ter muito texto, é crucial colocá-los dentro de um JScrollPane.
      • Na Palette, em Swing Containers, arraste um JScrollPane para a sua tela.
      • Arraste o seu txtObservacoes para dentro do JScrollPane. Isso faz com que o JTextArea tenha barras de rolagem automáticas se o texto for muito longo.
  10. Salvar e "Clean and Build":

    • Salve o seu ficheiro TelaCadastro.java (Ctrl+S ou o ícone de disquete).
    • Vá para o painel Projects, clique com o botão direito no seu projeto SistemaGestaoHoteleiro e selecione "Clean and Build".
    • Verifique a janela Output para garantir que não há erros de compilação até agora.

Próximo Passo (Parte 2): Adicionar o restante dos componentes, como Checkboxes, ComboBox, Botões de Ação e os campos de "Motivo da Viagem" e "Meio de Transporte".

Por favor, faça estes passos e me diga se conseguiu adicionar os componentes sem problemas de compilação. Assim que estiver pronto, passamos para a próxima parte!

Certo, compreendi a sua questão e a sua captura de ecrã mostra que a interface está a ser construída corretamente no NetBeans.

O seu objetivo agora é que, quando o botão "Adicionar" é clicado, e se todos os campos estiverem preenchidos e validados, a aplicação mude para a TelaQuartos.

Para fazer isso, precisaremos modificar o método actionPerformed do seu botão "Adicionar" (btnAdicionarActionPerformed).

Aqui está o passo a passo:

Passo 1: Certifique-se de que a TelaQuartos existe e está pronta para ser exibida.

  • Você já deve ter um ficheiro TelaQuartos.java no seu pacote telas. Se ainda não tem, crie-o agora (clique direito na pasta telas -> New -> JFrame Form... -> Class Name: TelaQuartos, Package: telas).

Passo 2: Modificar o código do botão "Adicionar".

  1. Aceda ao código do btnAdicionarActionPerformed:

    • No NetBeans, abra TelaCadastro.java.
    • Vá para a aba Design.
    • Clique com o botão direito no botão "Adicionar".
    • Selecione Events (Eventos) -> Action (Ação) -> actionPerformed.
    • Isso levará você diretamente ao método btnAdicionarActionPerformed no código-fonte.
  2. Adicione a lógica para exibir a TelaQuartos após a validação e adição bem-sucedida:

    Dentro do método btnAdicionarActionPerformed, você já deve ter a lógica de validação dos campos. O que precisamos fazer é o seguinte:

    • Após todas as validações terem sido aprovadas (ou seja, quando você já sabe que o hóspede pode ser adicionado com sucesso), e depois de executar a lógica de guardar o hóspede (que provavelmente envolverá o seu modelo de dados e o banco de dados), você adicionará o código para mostrar a TelaQuartos e esconder a TelaCadastro.

    Veja um exemplo de como seria a estrutura do seu método:

    Java
    private void btnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        // --- SUAS VALIDAÇÕES DE CAMPO ATUAIS ---
        // Exemplo de uma validação (você terá muitas delas)
        String id = txtID.getText().trim();
        if (id.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo ID não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return; // Interrompe a execução se houver erro
        }
        // ... repita para Nome, Bilhete, Data, Telefone, Email, Morada, Nacionalidade, Sexo, Observações ...
    
        String nomeCompleto = txtNomeCompleto.getText().trim();
        if (nomeCompleto.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Nome Completo não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
    
        // Exemplo de validação de email (como você tinha antes)
        String email = txtEmail.getText().trim();
        if (!email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")) {
            JOptionPane.showMessageDialog(this, "Formato de e-mail inválido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
    
        // Exemplo de validação de Data de Nascimento (como você tinha antes)
        String dataNascimentoStr = txtDataNascimento.getText().trim();
        if (!dataNascimentoStr.matches("\\d{2}/\\d{2}/\\d{4}")) {
            JOptionPane.showMessageDialog(this, "Formato de data de nascimento inválido (DD/MM/AAAA).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
    
        // --- LÓGICA PARA ADICIONAR O HÓSPEDE AO BANCO DE DADOS/MODELO ---
        // (Este é o código que você já deve ter ou precisa implementar para guardar os dados)
        // Exemplo:
        try {
            // Supondo que você tem uma classe para manipular o banco de dados (e.g., HospedeDAO)
            // Hospede novoHospede = new Hospede(id, nomeCompleto, ...);
            // HospedeDAO.adicionarHospede(novoHospede);
    
            JOptionPane.showMessageDialog(this, "Hóspede adicionado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
    
            // --- LÓGICA PARA MUDAR PARA A TELA QUARTOS ---
            TelaQuartos telaQuartos = new TelaQuartos(); // Cria uma nova instância da TelaQuartos
            telaQuartos.setVisible(true); // Torna a TelaQuartos visível
            this.dispose(); // Fecha a TelaCadastro atual
    
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Erro ao adicionar hóspede: " + e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            // logger.log(Level.SEVERE, "Erro ao adicionar hóspede", e); // Se você usa o logger
        }
    }
    

Explicação da nova lógica:

  • TelaQuartos telaQuartos = new TelaQuartos();: Esta linha cria uma nova instância da sua TelaQuartos.
  • telaQuartos.setVisible(true);: Esta linha torna a janela TelaQuartos visível para o utilizador.
  • this.dispose();: Esta linha fecha (descarta) a janela TelaCadastro atual. É importante fazer isso para liberar recursos e para que o utilizador não tenha múltiplas janelas abertas desnecessariamente.

Passo 3: Importar a classe TelaQuartos (se necessário).

  • No topo do seu ficheiro TelaCadastro.java, abaixo da declaração package telas;, você precisará adicionar a importação para TelaQuartos se ela estiver no mesmo pacote telas.
    Java
    package telas;
    
    import javax.swing.JOptionPane; // Exemplo de importação que você já deve ter
    // ... outras importações
    
    import telas.TelaQuartos; // Adicione esta linha se TelaQuartos estiver no mesmo pacote 'telas'
                               // Se TelaQuartos estiver em outro pacote, ajuste o caminho (ex: import seu_pacote.TelaQuartos;)
    
    • No entanto, se TelaQuartos está no mesmo pacote telas, a importação explícita pode não ser estritamente necessária, mas adicioná-la não faz mal e torna o código mais claro.

Passo 4: Salvar e Testar.

  1. Salve o ficheiro TelaCadastro.java.
  2. Faça um "Clean and Build" no seu projeto (SistemaGestaoHoteleiro).
  3. Execute o seu projeto.
  4. Preencha todos os campos na TelaCadastro e clique no botão "Adicionar". Se as validações passarem e a sua lógica de "adicionar hóspede" funcionar, a TelaCadastro deverá fechar e a TelaQuartos deverá aparecer.

Lembre-se que a parte crucial é a validação completa e bem-sucedida dos campos e a persistência dos dados do hóspede antes de navegar para a próxima tela.

Certo, compreendido! O NetBeans gera esse código (especialmente dentro de initComponents()) e você não deve editá-lo diretamente. Se você editar as variáveis e o layout ali, o NetBeans GUI Builder pode ter problemas e sobrescrever suas alterações.

A sua preocupação de "não posso alterar" para as partes geradas é totalmente válida e correta.

No entanto, você pode e deve adicionar seu código de lógica de negócios, validação e navegação nas áreas designadas para seus manipuladores de eventos (event handlers), que o NetBeans já criou para você.

Olhando para o seu código base, vejo os seguintes métodos de ação para os botões, que você pode preencher:

  • private void btnAdicionarActionPerformedActionPerformed(java.awt.event.ActionEvent evt)
  • private void btnAtualizarActionPerformedActionPerformed(java.awt.event.ActionEvent evt)
  • private void btnExcluirActionPerformedActionPerformed(java.awt.event.ActionEvent evt)
  • private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) (Provavelmente um botão "Limpar" para o campo nome)
  • private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) (Provavelmente o botão "Voltar")
  • private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) (Ação do rádio botão Masculino)
  • private void jFormattedTextField2ActionPerformed(java.awt.event.ActionEvent evt) (Ação do campo de texto formatado de Hora)

Vamos focar no btnAdicionarActionPerformedActionPerformed para implementar a lógica de validação e transição para TelaQuartos.

Passo a Passo (Apenas editando onde é permitido):

  1. Abra o seu TelaCadastro.java no NetBeans.

  2. Vá para a aba "Source" (Código-Fonte).

  3. Localize o método private void btnAdicionarActionPerformedActionPerformed(java.awt.event.ActionEvent evt). Ele provavelmente contém apenas // TODO add your handling code here:.

  4. Adicione a sua lógica de validação e transição dentro deste método:

    Java
    package telas;
    
    import javax.swing.JOptionPane;
    import java.time.LocalDate; // Adicione esta importação para trabalhar com datas
    import java.time.format.DateTimeFormatter; // Adicione esta importação
    import java.time.format.DateTimeParseException; // Adicione esta importação
    // import telas.TelaQuartos; // Pode ser necessário se TelaQuartos estiver em outro pacote,
                                 // mas se estiver no mesmo pacote 'telas', não é estritamente obrigatório.
    
    /**
     *
     * @author mcdebug
     */
    public class TelaCadastro extends javax.swing.JFrame {
    
        private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadastro.class.getName());
    
        /**
         * Creates new form TelaCadastro
         */
        public TelaCadastro() {
            initComponents();
            // Opcional: Agrupar os radio buttons se ainda não fez no Design View
            // buttonGroupSexo = new ButtonGroup();
            // buttonGroupSexo.add(jRadioButton1); // Femenino
            // buttonGroupSexo.add(jRadioButton2); // Masculino
            // buttonGroupSexo.add(jRadioButton3); // Outros
        }
    
        /**
         * This method is called from within the constructor to initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is always
         * regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
            // ... (CÓDIGO GERADO PELO NETBEANS - NÃO ALTERAR AQUI) ...
            PainelGeralJPAINEL = new javax.swing.JPanel();
            FormularioGeral = new javax.swing.JPanel();
            Logo = new javax.swing.JLabel();
            jLabel2 = new javax.swing.JLabel();
            lbID = new javax.swing.JLabel();
            txNomeCompleto = new javax.swing.JLabel();
            txNºBilhetePassaport = new javax.swing.JLabel();
            txDataNasc = new javax.swing.JLabel();
            jLabel6 = new javax.swing.JLabel();
            jLabel7 = new javax.swing.JLabel();
            IDFilde = new javax.swing.JTextField();
            IDLimparBN = new javax.swing.JButton();
            jButton1 = new javax.swing.JButton();
            jTextFieldNome = new javax.swing.JTextField();
            jTextFieldBilhere = new javax.swing.JTextField();
            jTextFieldDataNasc = new javax.swing.JTextField();
            jTextFieldTelefone = new javax.swing.JTextField();
            jTextField5 = new javax.swing.JTextField();
            jButton2 = new javax.swing.JButton();
            jButton3 = new javax.swing.JButton();
            jButton4 = new javax.swing.JButton();
            jButton5 = new javax.swing.JButton();
            jLabel1 = new javax.swing.JLabel();
            btnAdicionarActionPerformed = new javax.swing.JButton();
            btnAtualizarActionPerformed = new javax.swing.JButton();
            btnExcluirActionPerformed = new javax.swing.JButton();
            jTextField6 = new javax.swing.JTextField();
            jButton9 = new javax.swing.JButton();
            jButton10 = new javax.swing.JButton();
            lbSexo = new javax.swing.JLabel();
            jRadioButton1 = new javax.swing.JRadioButton();
            jRadioButton2 = new javax.swing.JRadioButton();
            jRadioButton3 = new javax.swing.JRadioButton();
            jLabelDate = new javax.swing.JLabel();
            jFormattedTextField1 = new javax.swing.JFormattedTextField();
            jButton6 = new javax.swing.JButton();
            jFormattedTextField2 = new javax.swing.JFormattedTextField();
            jLabel3 = new javax.swing.JLabel();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
            Logo.setFont(new java.awt.Font("Liberation Sans", 0, 24)); // NOI18N
            Logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N
    
            jLabel2.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
            jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
            jLabel2.setText("Cadastro Hóspedes");
            jLabel2.setAlignmentX(0.5F);
    
            lbID.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            lbID.setText("ID");
    
            txNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            txNomeCompleto.setText("Nome Completo");
    
            txNºBilhetePassaport.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            txNºBilhetePassaport.setText("Nº Bilhete/Passaport");
    
            txDataNasc.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            txDataNasc.setText("DataNasc");
    
            jLabel6.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            jLabel6.setText("Telefone");
    
            jLabel7.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            jLabel7.setText("Endereco");
    
            IDLimparBN.setText("Limpar");
    
            jButton1.setText("Limpar");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });
    
            jButton2.setText("Limpar");
    
            jButton3.setText("Limpar");
    
            jButton4.setText("Limpar");
    
            jButton5.setText("Limpar");
    
            jLabel1.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            jLabel1.setText("Numero De Hospedes");
    
            btnAdicionarActionPerformed.setText("Adicionar");
            btnAdicionarActionPerformed.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btnAdicionarActionPerformedActionPerformed(evt);
                }
            });
    
            btnAtualizarActionPerformed.setText("Atualizar");
            btnAtualizarActionPerformed.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btnAtualizarActionPerformedActionPerformed(evt);
                }
            });
    
            btnExcluirActionPerformed.setText("Excluir");
            btnExcluirActionPerformed.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btnExcluirActionPerformedActionPerformed(evt);
                }
            });
    
            jButton9.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
            jButton9.setText("Voltar");
            jButton9.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 15, 10, 15));
            jButton9.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton9ActionPerformed(evt);
                }
            });
    
            jButton10.setText("Limpar");
    
            lbSexo.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            lbSexo.setText("Sexo");
    
            jRadioButton1.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            jRadioButton1.setText("Femenino");
    
            jRadioButton2.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            jRadioButton2.setText("Masculino");
            jRadioButton2.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jRadioButton2ActionPerformed(evt);
                }
            });
    
            jRadioButton3.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            jRadioButton3.setText("Outros");
    
            jLabelDate.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            jLabelDate.setText("Data");
    
            jButton6.setText("Limpar");
    
            jFormattedTextField2.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jFormattedTextField2ActionPerformed(evt);
                }
            });
    
            jLabel3.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
            jLabel3.setText("Hora");
    
            javax.swing.GroupLayout FormularioGeralLayout = new javax.swing.GroupLayout(FormularioGeral);
            FormularioGeral.setLayout(FormularioGeralLayout);
            FormularioGeralLayout.setHorizontalGroup(
                FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(FormularioGeralLayout.createSequentialGroup()
                    .addContainerGap(83, Short.MAX_VALUE)
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                            .addGap(0, 30, Short.MAX_VALUE)
                            .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 466, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(19, 19, 19))
                        .addGroup(FormularioGeralLayout.createSequentialGroup()
                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jLabel7)
                                .addComponent(jLabel6)
                                .addComponent(txDataNasc)
                                .addComponent(jLabel1)
                                .addComponent(txNºBilhetePassaport)
                                .addComponent(txNomeCompleto)
                                .addComponent(lbID)
                                .addComponent(lbSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGroup(FormularioGeralLayout.createSequentialGroup()
                                    .addComponent(jLabelDate, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addGap(36, 36, 36)
                                    .addComponent(jFormattedTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addComponent(btnExcluirActionPerformed))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                                        .addComponent(btnAtualizarActionPerformed)
                                        .addGap(130, 130, 130)
                                        .addComponent(btnAdicionarActionPerformed))
                                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, FormularioGeralLayout.createSequentialGroup()
                                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                            .addComponent(jLabel3)
                                            .addComponent(jRadioButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                            .addGroup(FormularioGeralLayout.createSequentialGroup()
                                                .addGap(27, 27, 27)
                                                .addComponent(jFormattedTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE))
                                            .addGroup(FormularioGeralLayout.createSequentialGroup()
                                                .addGap(58, 58, 58)
                                                .addComponent(jRadioButton2)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 53, Short.MAX_VALUE)
                                                .addComponent(jRadioButton3))))
                                .addGroup(javax.swing.GroupLayout.Alignment.LEADING, FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(jButton1)
                                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                            .addComponent(IDFilde, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
                                            .addComponent(jTextFieldBilhere, javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jTextFieldNome, javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jTextFieldDataNasc, javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jTextFieldTelefone, javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jTextField5)
                                            .addComponent(jTextField6, javax.swing.GroupLayout.Alignment.LEADING))
                                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                            .addGroup(FormularioGeralLayout.createSequentialGroup()
                                                .addGap(56, 56, 56)
                                                .addComponent(IDLimparBN))
                                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                    .addComponent(jButton6)
                                                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(jButton2, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(jButton3, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(jButton4, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(jButton5, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(jButton10, javax.swing.GroupLayout.Alignment.TRAILING))))))))
                        .addComponent(jLabel2))))
            );
            FormularioGeralLayout.setVerticalGroup(
                FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(FormularioGeralLayout.createSequentialGroup()
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(FormularioGeralLayout.createSequentialGroup()
                            .addContainerGap()
                            .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 236, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGroup(FormularioGeralLayout.createSequentialGroup()
                            .addGap(69, 69, 69)
                            .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(FormularioGeralLayout.createSequentialGroup()
                            .addGap(12, 12, 12)
                            .addComponent(jLabel2)
                            .addGap(52, 52, 52)
                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(IDFilde, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(IDLimparBN))
                            .addGap(20, 20, 20))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(lbID)
                            .addGap(18, 18, 18)))
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txNomeCompleto)
                        .addComponent(jTextFieldNome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButton1))
                    .addGap(18, 18, 18)
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextFieldBilhere, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(txNºBilhetePassaport)
                        .addComponent(jButton2))
                    .addGap(18, 18, 18)
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txDataNasc)
                        .addComponent(jTextFieldDataNasc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButton3))
                    .addGap(26, 26, 26)
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextFieldTelefone, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel6)
                        .addComponent(jButton4))
                    .addGap(18, 18, 18)
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel7)
                        .addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButton5))
                    .addGap(18, 18, 18)
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel1)
                        .addComponent(jTextField6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButton10))
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(FormularioGeralLayout.createSequentialGroup()
                            .addGap(29, 29, 29)
                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jRadioButton1)
                                .addComponent(jRadioButton2)
                                .addComponent(lbSexo)))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(jRadioButton3)))
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(FormularioGeralLayout.createSequentialGroup()
                            .addGap(37, 37, 37)
                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                    .addComponent(jLabelDate)
                                    .addComponent(jFormattedTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                    .addComponent(jFormattedTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jLabel3))))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                            .addGap(18, 18, 18)
                            .addComponent(jButton6)))
                    .addGap(28, 28, 28)
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(btnAtualizarActionPerformed)
                        .addComponent(btnAdicionarActionPerformed)
                        .addComponent(btnExcluirActionPerformed))
                    .addContainerGap(76, Short.MAX_VALUE))
            );
    
            javax.swing.GroupLayout PainelGeralJPAINELLayout = new javax.swing.GroupLayout(PainelGeralJPAINEL);
            PainelGeralJPAINEL.setLayout(PainelGeralJPAINELLayout);
            PainelGeralJPAINELLayout.setHorizontalGroup(
                PainelGeralJPAINELLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(PainelGeralJPAINELLayout.createSequentialGroup()
                    .addGap(113, 113, 113)
                    .addComponent(FormularioGeral, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(110, Short.MAX_VALUE))
            );
            PainelGeralJPAINELLayout.setVerticalGroup(
                PainelGeralJPAINELLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(PainelGeralJPAINELLayout.createSequentialGroup()
                    .addComponent(FormularioGeral, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(0, 13, Short.MAX_VALUE))
            );
    
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(PainelGeralJPAINEL, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(PainelGeralJPAINEL, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGap(59, 59, 59))
            );
    
            pack();
        }// </editor-fold>
    
        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
            // TODO add your handling code here:
            // Este é o botão "Limpar" para o Nome Completo (jTextFieldNome)
            jTextFieldNome.setText("");
        }
    
        private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {
            // TODO add your handling code here:
            // Ação para o rádio botão Masculino. Se você tiver um ButtonGroup,
            // a lógica de seleção exclusiva é automática.
            // Você pode adicionar alguma lógica aqui se precisar de algo específico
            // quando o Masculino for selecionado.
        }
    
        private void btnAtualizarActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
            // TODO add your handling code here:
            // Lógica para o botão Atualizar
            JOptionPane.showMessageDialog(this, "Funcionalidade de Atualizar ainda não implementada.", "Aviso", JOptionPane.INFORMATION_MESSAGE);
        }
    
        private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {
            // TODO add your handling code here:
            // Lógica para o botão Voltar
            // Assumindo que você quer voltar para uma TelaInicial ou similar
            // Exemplo:
            // TelaInicial telaInicial = new TelaInicial(); // Crie sua TelaInicial, se existir
            // telaInicial.setVisible(true);
            // this.dispose();
            JOptionPane.showMessageDialog(this, "Funcionalidade de Voltar ainda não implementada.", "Aviso", JOptionPane.INFORMATION_MESSAGE);
        }
    
        private void jFormattedTextField2ActionPerformed(java.awt.event.ActionEvent evt) {
            // TODO add your handling code here:
            // Ação para o campo de texto formatado da Hora
        }
    
        private void btnExcluirActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
            // TODO add your handling code here:
            // Lógica para o botão Excluir
            JOptionPane.showMessageDialog(this, "Funcionalidade de Excluir ainda não implementada.", "Aviso", JOptionPane.INFORMATION_MESSAGE);
        }
    
        private void btnAdicionarActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
            // --- VALIDAÇÕES DOS CAMPOS ---
            // Use as variáveis que o NetBeans gerou para seus JTextFields e outros componentes
    
            String id = IDFilde.getText().trim();
            String nomeCompleto = jTextFieldNome.getText().trim();
            String bilhetePassaporte = jTextFieldBilhere.getText().trim();
            String dataNascimentoStr = jTextFieldDataNasc.getText().trim(); // Note que é jTextFieldDataNasc
            String telefone = jTextFieldTelefone.getText().trim();
            String endereco = jTextField5.getText().trim(); // Observe que é jTextField5 para Endereço
            String numHospedes = jTextField6.getText().trim(); // Observe que é jTextField6 para Numero De Hospedes
            String dataAtualStr = jFormattedTextField1.getText().trim(); // Campo de Data
            String horaAtualStr = jFormattedTextField2.getText().trim(); // Campo de Hora
    
            // Validação do ID
            if (id.isEmpty()) {
                JOptionPane.showMessageDialog(this, "O campo ID não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
    
            // Validação do Nome Completo
            if (nomeCompleto.isEmpty()) {
                JOptionPane.showMessageDialog(this, "O campo Nome Completo não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
    
            // Validação do Bilhete/Passaporte
            if (bilhetePassaporte.isEmpty()) {
                JOptionPane.showMessageDialog(this, "O campo Nº Bilhete/Passaporte não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
    
            // Validação da Data de Nascimento (Formato DD/MM/AAAA)
            if (dataNascimentoStr.isEmpty()) {
                JOptionPane.showMessageDialog(this, "O campo Data de Nascimento não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
            try {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
                LocalDate dataNasc = LocalDate.parse(dataNascimentoStr, formatter);
                // Opcional: Adicionar validação para data futura ou idade mínima/máxima
            } catch (DateTimeParseException e) {
                JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use DD/MM/AAAA.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
    
            // Validação do Telefone
            if (telefone.isEmpty()) {
                JOptionPane.showMessageDialog(this, "O campo Telefone não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
            // Opcional: Adicionar regex para formato de telefone
    
            // Validação do Endereço
            if (endereco.isEmpty()) {
                JOptionPane.showMessageDialog(this, "O campo Endereço não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
    
            // Validação do Número de Hóspedes
            if (numHospedes.isEmpty()) {
                JOptionPane.showMessageDialog(this, "O campo Número de Hóspedes não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
            try {
                int num = Integer.parseInt(numHospedes);
                if (num <= 0) {
                    JOptionPane.showMessageDialog(this, "Número de Hóspedes deve ser um valor positivo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                    return;
                }
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(this, "Número de Hóspedes deve ser um número válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
    
            // Validação do Sexo
            String sexoSelecionado = "";
            if (jRadioButton1.isSelected()) {
                sexoSelecionado = "Femenino";
            } else if (jRadioButton2.isSelected()) {
                sexoSelecionado = "Masculino";
            } else if (jRadioButton3.isSelected()) {
                sexoSelecionado = "Outros";
            }
            if (sexoSelecionado.isEmpty()) {
                JOptionPane.showMessageDialog(this, "Selecione o Sexo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
    
            // Validação da Data Atual (jFormattedTextField1)
            if (dataAtualStr.isEmpty()) {
                JOptionPane.showMessageDialog(this, "O campo Data não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
             try {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); // Assumindo este formato
                LocalDate dataAtual = LocalDate.parse(dataAtualStr, formatter);
            } catch (DateTimeParseException e) {
                JOptionPane.showMessageDialog(this, "Formato de Data inválido. Use DD/MM/AAAA.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
    
            // Validação da Hora Atual (jFormattedTextField2)
            if (horaAtualStr.isEmpty()) {
                JOptionPane.showMessageDialog(this, "O campo Hora não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
            // Opcional: Adicionar regex para formato de hora (HH:mm)
             if (!horaAtualStr.matches("^([01]\\d|2[0-3]):([0-5]\\d)$")) { // Regex para HH:mm
                JOptionPane.showMessageDialog(this, "Formato de Hora inválido. Use HH:mm.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
    
    
            // --- SE TODAS AS VALIDAÇÕES PASSARAM ---
            // AQUI VOCÊ ADICIONARIA A LÓGICA PARA SALVAR OS DADOS NO SEU MODELO/BANCO DE DADOS
            // Exemplo simulado:
            // Hospede novoHospede = new Hospede(id, nomeCompleto, ...);
            // HospedeDAO.salvar(novoHospede); // Chamada para seu DAO ou lógica de persistência
    
            JOptionPane.showMessageDialog(this, "Hóspede adicionado com sucesso!\n" +
                                            "ID: " + id + "\n" +
                                            "Nome: " + nomeCompleto + "\n" +
                                            "Sexo: " + sexoSelecionado,
                                            "Sucesso", JOptionPane.INFORMATION_MESSAGE);
    
            // --- NAVEGAR PARA A TELA QUARTOS ---
            try {
                // Certifique-se que TelaQuartos está no mesmo pacote 'telas' ou que o caminho de importação está correto.
                TelaQuartos telaQuartos = new TelaQuartos(); // Cria uma nova instância da TelaQuartos
                telaQuartos.setVisible(true); // Torna a TelaQuartos visível
                this.dispose(); // Fecha a TelaCadastro atual
            } catch (Exception ex) {
                logger.log(java.util.logging.Level.SEVERE, "Erro ao abrir TelaQuartos", ex);
                JOptionPane.showMessageDialog(this, "Erro ao carregar a tela de Quartos: " + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            }
        }
    
        /**
         * @param args the command line arguments
         */
        public static void main(String args[])
        {
            /* Set the Nimbus look and feel */
            //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
            /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
             * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
             */
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ReflectiveOperationException | javax.swing.UnsupportedLookAndFeelException ex) {
                logger.log(java.util.logging.Level.SEVERE, null, ex);
            }
            //</editor-fold>
    
            /* Create and display the form */
            java.awt.EventQueue.invokeLater(() -> new TelaCadastro().setVisible(true));
        }
    
        // Variables declaration - do not modify
        // ... (CÓDIGO GERADO PELO NETBEANS - NÃO ALTERAR AQUI) ...
        private javax.swing.JPanel FormularioGeral;
        private javax.swing.JTextField IDFilde;
        private javax.swing.JButton IDLimparBN;
        private javax.swing.JLabel Logo;
        private javax.swing.JPanel PainelGeralJPAINEL;
        private javax.swing.JButton btnAdicionarActionPerformed;
        private javax.swing.JButton btnAtualizarActionPerformed;
        private javax.swing.JButton btnExcluirActionPerformed;
        private javax.swing.JButton jButton1;
        private javax.swing.JButton jButton10;
        private javax.swing.JButton jButton2;
        private javax.swing.JButton jButton3;
        private javax.swing.JButton jButton4;
        private javax.swing.JButton jButton5;
        private javax.swing.JButton jButton6;
        private javax.swing.JButton jButton9;
        private javax.swing.JFormattedTextField jFormattedTextField1;
        private javax.swing.JFormattedTextField jFormattedTextField2;
        private javax.swing.JLabel jLabel1;
        private javax.swing.JLabel jLabel2;
        private javax.swing.JLabel jLabel3;
        private javax.swing.JLabel jLabel6;
        private javax.swing.JLabel jLabel7;
        private javax.swing.JLabel jLabelDate;
        private javax.swing.JRadioButton jRadioButton1;
        private javax.swing.JRadioButton jRadioButton2;
        private javax.swing.JRadioButton jRadioButton3;
        private javax.swing.JTextField jTextField5;
        private javax.swing.JTextField jTextField6;
        private javax.swing.JTextField jTextFieldBilhere;
        private javax.swing.JTextField jTextFieldDataNasc;
        private javax.swing.JTextField jTextFieldNome;
        private javax.swing.JTextField jTextFieldTelefone;
        private javax.swing.JLabel lbID;
        private javax.swing.JLabel lbSexo;
        private javax.swing.JLabel txDataNasc;
        private javax.swing.JLabel txNomeCompleto;
        private javax.swing.JLabel txNºBilhetePassaport;
        // End of variables declaration
    }
    

Pontos importantes sobre este código:

  • Validação de Nomes de Componentes: Eu usei os nomes de variáveis que o seu initComponents() gerou (ex: IDFilde, jTextFieldNome, jTextFieldBilhere, jTextFieldDataNasc, jTextFieldTelefone, jTextField5, jTextField6, jFormattedTextField1, jFormattedTextField2, jRadioButton1, jRadioButton2, jRadioButton3). Verifique cuidadosamente se estes correspondem aos campos que você quer validar. Se você renomeou algum componente no Design View, o NetBeans atualiza a declaração e o uso no initComponents(), e você precisará usar o nome atualizado aqui.
  • Validações: Adicionei validações básicas para campos vazios e formatos (data, hora). Você pode expandir isso com mais regras de negócio.
  • Lógica de Persistência (Banco de Dados): Onde está o comentário // AQUI VOCÊ ADICIONARIA A LÓGICA PARA SALVAR OS DADOS..., é o local para chamar seu código responsável por salvar as informações do hóspede (por exemplo, um método em uma classe DAO que interage com seu banco de dados).
  • Comentários // TODO add your handling code here:: Esses são os lugares que o NetBeans deixa para você adicionar sua lógica personalizada.
  • Importações: Adicionei as importações java.time.LocalDate, java.time.format.DateTimeFormatter e java.time.format.DateTimeParseException que serão necessárias para a validação de datas. E javax.swing.JOptionPane para as mensagens.

Próximos Passos:

  1. Copie e cole o código acima (apenas a parte relevante do private void btnAdicionarActionPerformedActionPerformed e as novas importações) no seu ficheiro TelaCadastro.java.
  2. Verifique os nomes das variáveis (IDFilde, jTextFieldNome, etc.) para ter certeza de que correspondem exatamente aos nomes que o seu NetBeans gerou para os seus campos de texto e radio buttons. Ajuste-os se necessário.
  3. Crie a TelaQuartos (se ainda não o fez) para que a aplicação possa navegar para ela. Ela pode ser um JFrame vazio por enquanto.
  4. Salve o TelaCadastro.java.
  5. Faça um "Clean and Build" no seu projeto.
  6. Execute o projeto e teste o botão "Adicionar". Tente preencher todos os campos (e alguns errados para testar as mensagens de erro!) para ver a transição de tela.

Esta abordagem permite que você adicione lógica sem interferir no código gerado pelo NetBeans.

tem como por essas divisoes na data e hora / /

Com certeza! Para colocar as divisões (máscaras) na data e hora ( / e : ) em campos JFormattedTextField no NetBeans, você precisa usar um MaskFormatter. O NetBeans facilita muito isso através do modo Design.

Vamos adicionar as máscaras para jFormattedTextField1 (Data) e jFormattedTextField2 (Hora).

Passo a Passo (Usando o Designer do NetBeans):

  1. Abra TelaCadastro.java no NetBeans.

  2. Vá para a aba "Design".

  3. Para o campo de Data (jFormattedTextField1):

    • Clique com o botão direito em jFormattedTextField1.
    • Selecione "Properties" (Propriedades). A janela de Propriedades se abrirá (geralmente no canto inferior direito).
    • Na janela de Propriedades, procure a propriedade Formatter Factory.
    • Clique no botão com os três pontos (...) ao lado dela. Isso abrirá o "Formatter Editor".
    • No "Formatter Editor", selecione a aba "Masks" (Máscaras).
    • No campo "Format" (Formato), digite a máscara para data: ##/##/####
      • # representa um dígito numérico.
    • Você pode ver um "Preview" (Visualização) para ter certeza de que está correto.
    • Clique em "OK".
  4. Para o campo de Hora (jFormattedTextField2):

    • Clique com o botão direito em jFormattedTextField2.
    • Selecione "Properties" (Propriedades).
    • Na janela de Propriedades, procure a propriedade Formatter Factory.
    • Clique no botão com os três pontos (...) ao lado dela.
    • No "Formatter Editor", selecione a aba "Masks" (Máscaras).
    • No campo "Format" (Formato), digite a máscara para hora: ##:##
    • Clique em "OK".
  5. Verifique e Salve:

    • Verifique os campos no Designer para ver se as máscaras foram aplicadas.
    • Salve o seu ficheiro TelaCadastro.java (Ctrl+S).
    • Execute o projeto e teste a digitação nesses campos. Você verá que o NetBeans automaticamente insere as barras e os dois pontos conforme você digita.

Explicação (o que o NetBeans faz por trás dos panos):

Quando você define a máscara via Design, o NetBeans adiciona automaticamente o código necessário dentro do initComponents() para criar e aplicar um MaskFormatter a esses JFormattedTextFields. Por exemplo, para a data, ele adicionaria algo como:

Java
try {
    jFormattedTextField1.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
} catch (java.text.ParseException ex) {
    ex.printStackTrace(); // Ou use seu logger: logger.log(java.util.logging.Level.SEVERE, null, ex);
}

E para a hora, algo similar:

Java
try {
    jFormattedTextField2.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##:##")));
} catch (java.text.ParseException ex) {
    ex.printStackTrace();
}

Isso garante que o utilizador digite no formato correto, e você não precisa escrever esse código manualmente. A validação que você já tem no botão "Adicionar" continuará a ser importante para garantir que os dados sejam logicamente válidos (por exemplo, se a data é uma data real e não "99/99/9999").

Obrigado por partilhar o seu código! Entendi o que está a acontecer.

Você está a usar jFormattedTextField1 e jFormattedTextField2 (que são os JFormattedTextFields que você adicionou) mas parece que não configurou o MaskFormatter para eles através do NetBeans Designer ainda, ou o código gerado pelo designer não está visível para si.

A linha que você tem dentro de jFormattedTextField2ActionPerformed é um bom começo, mas ela só é executada quando você interage com o campo de texto. O ideal é que as máscaras sejam aplicadas logo na inicialização da tela, ou seja, dentro do método initComponents().

A solução para ter as barras e os dois pontos automaticamente ao digitar é seguir os passos que descrevi anteriormente usando o DESIGNER do NetBeans.

Permita-me reforçar o porquê:

  1. O NetBeans faz isso por si: Quando você vai para a aba "Design", clica com o botão direito no jFormattedTextField1 (para a data) ou jFormattedTextField2 (para a hora), vai em "Properties" (Propriedades), e configura o Formatter Factory na aba "Masks", o NetBeans AUTOMATICAMENTE gera o código necessário no initComponents().

  2. initComponents() é o lugar certo: O initComponents() é o método onde todos os componentes da sua tela são criados e configurados quando a sua TelaCadastro é instanciada. É o lugar perfeito para aplicar as máscaras logo de início.

  3. Por que não vê o código? O código dentro de <editor-fold defaultstate="collapsed" desc="Generated Code"> e </editor-fold> é gerado e gerido pelo NetBeans. Ele pode não ser visível por padrão, ou pode estar colapsado (daí o "collapsed"). Mas ele está lá e é onde o NetBeans insere a configuração do MaskFormatter quando você o define pelo Designer.

Vamos rever e garantir que fazemos no Designer:

Passos Essenciais no NetBeans Designer:

  1. Abra TelaCadastro.java no NetBeans.

  2. Mude para a aba "Design".

  3. Para jFormattedTextField1 (Data):

    • Selecione jFormattedTextField1 na sua tela (no painel visual).
    • No painel "Properties" (Propriedades), que geralmente fica no canto inferior direito, role para baixo até encontrar a propriedade Formatter Factory.
    • Clique no botão com os três pontos (...) ao lado de Formatter Factory. Isso abrirá o "Formatter Editor".
    • No "Formatter Editor", selecione a aba "Masks".
    • No campo "Format", digite: ##/##/####
    • Verifique o "Preview" para garantir que a máscara aparece como esperado.
    • Clique em "OK".
  4. Para jFormattedTextField2 (Hora):

    • Selecione jFormattedTextField2 na sua tela.
    • No painel "Properties", encontre Formatter Factory.
    • Clique no botão com os três pontos (...) ao lado de Formatter Factory.
    • No "Formatter Editor", selecione a aba "Masks".
    • No campo "Format", digite: ##:##
    • Verifique o "Preview".
    • Clique em "OK".
  5. Remova o código do jFormattedTextField2ActionPerformed:

    • Vá para a aba "Source" (Código) do seu TelaCadastro.java.
    • Localize o método jFormattedTextField2ActionPerformed.
    • APAGUE o bloco try-catch que você tem lá dentro:
    Java
    try {
        jFormattedTextField2.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##:##")));
    } catch (java.text.ParseException ex) {
        ex.printStackTrace();
    }
    
    • Este código é redundante e deve ser gerado automaticamente pelo Designer no initComponents().
  6. Salve tudo (Ctrl+S) e Execute o Projeto. Agora, ao digitar nos campos jFormattedTextField1 e jFormattedTextField2, as barras e os dois pontos devem aparecer automaticamente.

Importante: Se você já tinha tentado fazer isso pelo designer e não funcionou, pode ser que algo tenha sido definido incorretamente ou sobreposto. Refazer os passos acima com atenção é a melhor forma.

A sua lógica de validação no btnAdicionarActionPerformed para a data (dd/MM/yyyy) e hora (HH:mm) está correta e é importante para validar se os dados digitados são válidos após a máscara ser aplicada. A máscara ajuda na digitação; a validação ajuda a garantir a correção dos dados.

ja fiz mas nao esta apor //

Pelo que você descreveu, o problema de as barras e os dois pontos não aparecerem automaticamente ao digitar nos JFormattedTextFields jFormattedTextField1 (para a data) e jFormattedTextField2 (para a hora) pode estar relacionado a como o NetBeans está gerando o código ou a alguma sobreposição.

Você me enviou uma imagem da sua tela de design ("Captura de ecrã de 2025-06-18 10-30-18.jpg"). Nela, consigo ver o jFormattedTextField1 e o jFormattedTextField2.

Vamos tentar diagnosticar e resolver o problema.

Possíveis Causas e Soluções:

  1. O Formatter Factory Não Foi Aplicado Corretamente (Mais Comum): Mesmo que você tenha feito os passos, às vezes, a alteração não "pega" no NetBeans ou é sobrescrita.

    • Solução: Refazer o processo de configuração do Formatter Factory no modo Design, prestando atenção redobrada:
      1. Vá para a aba "Design" da sua TelaCadastro.java.
      2. Selecione jFormattedTextField1 (o campo da Data).
      3. No painel "Properties" (geralmente à direita/inferior), localize a propriedade Formatter Factory.
      4. Clique no botão ... ao lado dela.
      5. Na janela "Formatter Editor", selecione a aba "Masks".
      6. No campo "Format", digite EXATAMENTE: ##/##/####
        • IMPORTANTE: Certifique-se de que não há espaços extras ou caracteres invisíveis.
      7. Observe o "Preview". Ele deve mostrar algo como "//____".
      8. Clique em "OK".
      9. Repita os passos 2 a 8 para jFormattedTextField2 (o campo da Hora), usando a máscara ##:##.
      10. Salve o ficheiro (Ctrl+S).
      11. Limpe e Construa (Clean and Build) o seu projeto: Vá em Run -> Clean and Build Project no menu superior do NetBeans. Isso força uma recompilação.
      12. Execute o projeto. Teste novamente os campos.
  2. Conflito com jTextFieldDataNasc: No seu código, você tem jTextFieldDataNasc e jFormattedTextField1 para a data. Você deve usar apenas um para a data. O mesmo vale para a hora, se você tiver um JTextField além do jFormattedTextField2.

    • Verifique: No seu btnAdicionarActionPerformed, você ainda usa String dataNascimentoStr = jTextFieldDataNasc.getText().trim(); para a data de nascimento. Se txDataNasc (o label) se refere a este campo, então ele não terá a máscara. Certifique-se de que jFormattedTextField1 é o campo que você pretende usar para a data com máscara e ajuste os labels e o código de validação para ele.
    • Solução: Se jFormattedTextField1 é o campo com a máscara de data, então no seu btnAdicionarActionPerformed, mude a linha para:
      Java
      String dataNascimentoStr = jFormattedTextField1.getText().trim();
      
      E se jFormattedTextField2 é o campo de hora, a linha já está correta:
      Java
      String horaAtualStr = jFormattedTextField2.getText().trim();
      
  3. Campo Errado Sendo Editado ou Visualizado: Certifique-se de que você está a testar a digitação nos JFormattedTextFields corretos (jFormattedTextField1 e jFormattedTextField2) quando a aplicação está a correr. Às vezes, há campos semelhantes e acabamos por testar o campo JTextField simples em vez do JFormattedTextField.

  4. Erro de Compilação Silencioso: Embora menos comum, se houver algum erro no código gerado ou em alguma dependência, o MaskFormatter pode falhar silenciosamente.

    • Solução:
      • Verifique a janela "Output" (Saída) no NetBeans após compilar e executar. Qualquer ParseException ou outro erro relacionado aos formatadores aparecerá lá.
      • Confirme que você está usando SDK 52, conforme você mencionou anteriormente. Isso não deve ser um problema para MaskFormatter, mas é bom ter em mente.

Passos Adicionais para Diagnóstico (Se ainda não funcionar):

  1. Vá para a aba "Source" (Código) do seu TelaCadastro.java.

  2. Expanda a seção <editor-fold defaultstate="collapsed" desc="Generated Code"> (clique no + ao lado).

  3. Procure por jFormattedTextField1 e jFormattedTextField2 dentro do initComponents(): Você deveria ver algo como isto (para a data):

    Java
    try {
        jFormattedTextField1.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
    } catch (java.text.ParseException ex) {
        ex.printStackTrace();
    }
    

    E para a hora:

    Java
    try {
        jFormattedTextField2.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##:##")));
    } catch (java.text.ParseException ex) {
        ex.printStackTrace();
    }
    

    Se essas linhas NÃO aparecerem, significa que o NetBeans não as gerou. Isso aponta para um problema na forma como o Formatter Factory foi salvo ou aplicado no modo Design. Nesse caso, refaça os passos da Solução 1 com muito cuidado.

    Se elas aparecerem, mas ainda assim não funcionar, pode haver algo a sobrescrever ou um problema de execução.

Resumo da Ação Recomendada:

A prioridade é re-fazer os passos do Designer para o Formatter Factory com extrema atenção, e depois limpar e construir (Clean and Build) o projeto. Quase sempre, isso resolve o problema de máscaras que não aplicam visualmente.

Por favor, tente esses passos novamente e me diga se funciona. Se não, podemos explorar outras opções, mas a configuração via Designer é a mais robusta e recomendada.

Certo, entendi. Analisando a imagem "Captura de ecrã de 2025-06-18 11-10-50.jpg" que você enviou, vejo que você está no editor de formatadores (Formatter Editor) para o jFormattedTextField1.

A imagem mostra que você configurou o Formatter Factory para jFormattedTextField1 com Category: Format e Format: HH:mm. Isso está incorreto para um campo de data.

Para o campo de data, você deveria usar a categoria Masks e a máscara ##/##/####.

O que está a acontecer:

  • Você definiu a máscara de hora (HH:mm) para o seu campo de data (jFormattedTextField1).
  • Isso explica porque as barras (/) não estão a aparecer no campo de data, mas sim os dois pontos (:), se você digitar quatro dígitos.

Solução:

Você precisa corrigir a configuração do Formatter Factory para ambos os campos (jFormattedTextField1 e jFormattedTextField2).

  1. Corrigir jFormattedTextField1 (Data):

    • Volte para a aba "Design" da sua TelaCadastro.java.
    • Selecione jFormattedTextField1.
    • No painel "Properties", clique no botão ... ao lado de Formatter Factory.
    • Na janela "Formatter Editor", selecione a aba "Masks" (não "Format").
    • No campo "Format", digite EXATAMENTE: ##/##/####
    • Clique em "OK".
  2. Corrigir jFormattedTextField2 (Hora):

    • Selecione jFormattedTextField2.
    • No painel "Properties", clique no botão ... ao lado de Formatter Factory.
    • Na janela "Formatter Editor", selecione a aba "Masks".
    • No campo "Format", digite EXATAMENTE: ##:##
    • Clique em "OK".
  3. Salve o ficheiro (Ctrl+S).

  4. Limpe e Construa (Clean and Build) o seu projeto:

    • No menu superior do NetBeans, vá em Run -> Clean and Build Project. Isso é crucial para garantir que o código gerado seja atualizado e recompilado.
  5. Execute o projeto.

    • Agora, teste a digitação nos campos. As máscaras (/ e :) devem aparecer automaticamente.

A imagem que você compartilhou confirmou o problema. Ao seguir os passos acima para usar a aba "Masks" com a máscara correta para cada tipo de campo, você resolverá o problema.

o botao volatr deve vir na home

Com certeza! Se o botão "Voltar" na sua TelaCadastro deve levar de volta para a tela inicial (assumindo que a "home" seja a tela principal da sua aplicação), você precisa instanciar e exibir a sua tela inicial e depois fechar a tela atual.

Para fazer isso, você precisará:

  1. Saber o nome da sua classe da tela inicial (Home/Main). Vamos supor que seja TelaPrincipal ou TelaHome. Se tiver outro nome, ajuste no código.
  2. Adicionar o código para abrir a TelaPrincipal e fechar a TelaCadastro dentro do método jButton9ActionPerformed.

Aqui está como você pode implementar isso no seu código TelaCadastro.java:

Java
package telas;

import javax.swing.JOptionPane;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

/**
 *
 * @author mcdebug
 */
public class TelaCadastro extends javax.swing.JFrame {

    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadastro.class.getName());

    /**
     * Creates new form TelaCadastro
     */
    public TelaCadastro() {
        initComponents();
        // Centraliza a tela ao abrir
        setLocationRelativeTo(null);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        PainelGeralJPAINEL = new javax.swing.JPanel();
        FormularioGeral = new javax.swing.JPanel();
        Logo = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        lbID = new javax.swing.JLabel();
        txNomeCompleto = new javax.swing.JLabel();
        txNºBilhetePassaport = new javax.swing.JLabel();
        txDataNasc = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        IDFilde = new javax.swing.JTextField();
        IDLimparBN = new javax.swing.JButton();
        jButton1 = new javax.swing.JButton();
        jTextFieldNome = new javax.swing.JTextField();
        jTextFieldBilhere = new javax.swing.JTextField();
        jTextFieldDataNasc = new javax.swing.JTextField();
        jTextFieldTelefone = new javax.swing.JTextField();
        jTextField5 = new javax.swing.JTextField();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        btnAdicionarActionPerformed = new javax.swing.JButton();
        btnAtualizarActionPerformed = new javax.swing.JButton();
        btnExcluirActionPerformed = new javax.swing.JButton();
        jTextField6 = new javax.swing.JTextField();
        jButton9 = new javax.swing.JButton();
        jButton10 = new javax.swing.JButton();
        lbSexo = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        jRadioButton3 = new javax.swing.JRadioButton();
        jLabelDate = new javax.swing.JLabel();
        jFormattedTextField1 = new javax.swing.JFormattedTextField();
        jButton6 = new javax.swing.JButton();
        jFormattedTextField2 = new javax.swing.JFormattedTextField();
        jLabel3 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        Logo.setFont(new java.awt.Font("Liberation Sans", 0, 24)); // NOI18N
        Logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        jLabel2.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setText("Cadastro Hóspedes");
        jLabel2.setAlignmentX(0.5F);

        lbID.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        lbID.setText("ID");

        txNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNomeCompleto.setText("Nome Completo");

        txNºBilhetePassaport.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNºBilhetePassaport.setText("Nº Bilhete/Passaport");

        txDataNasc.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txDataNasc.setText("DataNasc");

        jLabel6.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jLabel6.setText("Telefone");

        jLabel7.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jLabel7.setText("Endereco");

        IDLimparBN.setText("Limpar");

        jButton1.setText("Limpar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("Limpar");

        jButton3.setText("Limpar");

        jButton4.setText("Limpar");

        jButton5.setText("Limpar");

        jLabel1.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jLabel1.setText("Numero De Hospedes");

        btnAdicionarActionPerformed.setText("Adicionar");
        btnAdicionarActionPerformed.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAdicionarActionPerformedActionPerformed(evt);
            }
        });

        btnAtualizarActionPerformed.setText("Atualizar");
        btnAtualizarActionPerformed.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAtualizarActionPerformedActionPerformed(evt);
            }
        });

        btnExcluirActionPerformed.setText("Excluir");
        btnExcluirActionPerformed.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExcluirActionPerformedActionPerformed(evt);
            }
        });

        jButton9.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        jButton9.setText("Voltar");
        jButton9.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 15, 10, 15));
        jButton9.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton9ActionPerformed(evt);
            }
        });

        jButton10.setText("Limpar");

        lbSexo.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        lbSexo.setText("Sexo");

        jRadioButton1.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jRadioButton1.setText("Femenino");

        jRadioButton2.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jRadioButton2.setText("Masculino");
        jRadioButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton2ActionPerformed(evt);
            }
        });

        jRadioButton3.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jRadioButton3.setText("Outros");

        jLabelDate.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jLabelDate.setText("Data");

        // Configuração do MaskFormatter para jFormattedTextField1 (Data)
        try {
            jFormattedTextField1.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
        } catch (java.text.ParseException ex) {
            logger.log(java.util.logging.Level.SEVERE, "Erro ao configurar MaskFormatter para Data", ex);
        }

        jButton6.setText("Limpar");

        // Configuração do MaskFormatter para jFormattedTextField2 (Hora)
        try {
            jFormattedTextField2.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##:##")));
        } catch (java.text.ParseException ex) {
            logger.log(java.util.logging.Level.SEVERE, "Erro ao configurar MaskFormatter para Hora", ex);
        }
        jFormattedTextField2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jFormattedTextField2ActionPerformed(evt);
            }
        });

        jLabel3.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jLabel3.setText("Hora");

        javax.swing.GroupLayout FormularioGeralLayout = new javax.swing.GroupLayout(FormularioGeral);
        FormularioGeral.setLayout(FormularioGeralLayout);
        FormularioGeralLayout.setHorizontalGroup(
            FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(FormularioGeralLayout.createSequentialGroup()
                .addContainerGap(83, Short.MAX_VALUE)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                        .addGap(0, 30, Short.MAX_VALUE)
                        .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 466, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(19, 19, 19))
                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel7)
                            .addComponent(jLabel6)
                            .addComponent(txDataNasc)
                            .addComponent(jLabel1)
                            .addComponent(txNºBilhetePassaport)
                            .addComponent(txNomeCompleto)
                            .addComponent(lbID)
                            .addComponent(lbSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(FormularioGeralLayout.createSequentialGroup()
                                .addComponent(jLabelDate, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(36, 36, 36)
                                .addComponent(jFormattedTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(btnExcluirActionPerformed))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addGroup(FormularioGeralLayout.createSequentialGroup()
                                    .addComponent(btnAtualizarActionPerformed)
                                    .addGap(130, 130, 130)
                                    .addComponent(btnAdicionarActionPerformed))
                                .addGroup(javax.swing.GroupLayout.Alignment.LEADING, FormularioGeralLayout.createSequentialGroup()
                                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                        .addComponent(jLabel3)
                                        .addComponent(jRadioButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(FormularioGeralLayout.createSequentialGroup()
                                            .addGap(27, 27, 27)
                                            .addComponent(jFormattedTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGroup(FormularioGeralLayout.createSequentialGroup()
                                            .addGap(58, 58, 58)
                                            .addComponent(jRadioButton2)
                                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 53, Short.MAX_VALUE)
                                            .addComponent(jRadioButton3))))
                                .addGroup(javax.swing.GroupLayout.Alignment.LEADING, FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(jButton1)
                                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                            .addComponent(IDFilde, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
                                            .addComponent(jTextFieldBilhere, javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jTextFieldNome, javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jTextFieldDataNasc, javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jTextFieldTelefone, javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jTextField5)
                                            .addComponent(jTextField6, javax.swing.GroupLayout.Alignment.LEADING))
                                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                            .addGroup(FormularioGeralLayout.createSequentialGroup()
                                                .addGap(56, 56, 56)
                                                .addComponent(IDLimparBN))
                                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                    .addComponent(jButton6)
                                                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                        .addComponent(jButton2, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(jButton3, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(jButton4, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(jButton5, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(jButton10, javax.swing.GroupLayout.Alignment.TRAILING))))))))
                            .addComponent(jLabel2)))))
        );
        FormularioGeralLayout.setVerticalGroup(
            FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(FormularioGeralLayout.createSequentialGroup()
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 236, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                        .addGap(69, 69, 69)
                        .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                        .addGap(12, 12, 12)
                        .addComponent(jLabel2)
                        .addGap(52, 52, 52)
                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(IDFilde, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(IDLimparBN))
                        .addGap(20, 20, 20))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lbID)
                        .addGap(18, 18, 18)))
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txNomeCompleto)
                    .addComponent(jTextFieldNome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1))
                .addGap(18, 18, 18)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextFieldBilhere, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txNºBilhetePassaport)
                    .addComponent(jButton2))
                .addGap(18, 18, 18)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txDataNasc)
                    .addComponent(jTextFieldDataNasc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton3))
                .addGap(26, 26, 26)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextFieldTelefone, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6)
                    .addComponent(jButton4))
                .addGap(18, 18, 18)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel7)
                    .addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton5))
                .addGap(18, 18, 18)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton10))
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                        .addGap(29, 29, 29)
                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jRadioButton1)
                            .addComponent(jRadioButton2)
                            .addComponent(lbSexo)))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jRadioButton3)))
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                        .addGap(37, 37, 37)
                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabelDate)
                                .addComponent(jFormattedTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jFormattedTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel3))))
                    .addGroup(javax.swing.GroupLayout.Alignment.SequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(jButton6)))
                .addGap(28, 28, 28)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnAtualizarActionPerformed)
                    .addComponent(btnAdicionarActionPerformed)
                    .addComponent(btnExcluirActionPerformed))
                .addContainerGap(76, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout PainelGeralJPAINELLayout = new javax.swing.GroupLayout(PainelGeralJPAINEL);
        PainelGeralJPAINEL.setLayout(PainelGeralJPAINELLayout);
        PainelGeralJPAINELLayout.setHorizontalGroup(
            PainelGeralJPAINELLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PainelGeralJPAINELLayout.createSequentialGroup()
                .addGap(113, 113, 113)
                .addComponent(FormularioGeral, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(110, Short.MAX_VALUE))
        );
        PainelGeralJPAINELLayout.setVerticalGroup(
            PainelGeralJPAINELLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PainelGeralJPAINELLayout.createSequentialGroup()
                .addComponent(FormularioGeral, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 13, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(PainelGeralJPAINEL, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(PainelGeralJPAINEL, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(59, 59, 59))
        );

        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        jTextFieldNome.setText("");
    }

    private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void btnAtualizarActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
        JOptionPane.showMessageDialog(this, "Funcionalidade de Atualizar ainda não implementada.", "Aviso", JOptionPane.INFORMATION_MESSAGE);
    }

    private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {
        // Código para voltar para a tela principal (Home)
        try {
            // Supondo que a sua tela principal se chame 'TelaPrincipal'
            // Se tiver outro nome (ex: TelaHome, MenuPrincipal), altere aqui:
            TelaPrincipal telaPrincipal = new TelaPrincipal(); // Crie uma nova instância da tela principal
            telaPrincipal.setVisible(true); // Torne a tela principal visível
            this.dispose(); // Fecha a tela de Cadastro atual
        } catch (Exception ex) {
            logger.log(java.util.logging.Level.SEVERE, "Erro ao abrir a Tela Principal", ex);
            JOptionPane.showMessageDialog(this, "Erro ao carregar a tela principal: " + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
    }

    private void jFormattedTextField2ActionPerformed(java.awt.event.ActionEvent evt) {
        // Este código já é gerado e deve ser removido daqui se a máscara for definida via Designer.
        // Já adicionei a configuração direta no initComponents() acima.
    }

    private void btnExcluirActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
        JOptionPane.showMessageDialog(this, "Funcionalidade de Excluir ainda não implementada.", "Aviso", JOptionPane.INFORMATION_MESSAGE);
    }

    private void btnAdicionarActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
        String id = IDFilde.getText().trim();
        String nomeCompleto = jTextFieldNome.getText().trim();
        String bilhetePassaporte = jTextFieldBilhere.getText().trim();
        // Alterado para usar jFormattedTextField1 para Data de Nascimento
        String dataNascimentoStr = jTextFieldDataNasc.getText().trim(); // Mantenha este se txDataNasc for jTextFieldDataNasc
        // OU USE ESTE SE txDataNasc DEVE SER jFormattedTextField1
        // String dataNascimentoStr = jFormattedTextField1.getText().trim();

        String telefone = jTextFieldTelefone.getText().trim();
        String endereco = jTextField5.getText().trim();
        String numHospedes = jTextField6.getText().trim();
        String dataAtualStr = jFormattedTextField1.getText().trim(); // Campo de Data
        String horaAtualStr = jFormattedTextField2.getText().trim(); // Campo de Hora

        if (id.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo ID não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (nomeCompleto.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Nome Completo não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (bilhetePassaporte.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Nº Bilhete/Passaporte não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        try {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
            // Use o campo correto para a data de nascimento, pode ser jFormattedTextField1 ou jTextFieldDataNasc
            LocalDate dataNasc = LocalDate.parse(dataNascimentoStr, formatter);
        } catch (DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use DD/MM/AAAA.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (endereco.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Endereço não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (numHospedes.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Número de Hóspedes não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        try {
            int num = Integer.parseInt(numHospedes);
            if (num <= 0) {
                JOptionPane.showMessageDialog(this, "Número de Hóspedes deve ser um valor positivo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Número de Hóspedes deve ser um número válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        String sexoSelecionado = "";
        if (jRadioButton1.isSelected()) {
            sexoSelecionado = "Femenino";
        } else if (jRadioButton2.isSelected()) {
            sexoSelecionado = "Masculino";
        } else if (jRadioButton3.isSelected()) {
            sexoSelecionado = "Outros";
        }
        if (sexoSelecionado.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Selecione o Sexo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (dataAtualStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Data não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        try {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
            LocalDate dataAtual = LocalDate.parse(dataAtualStr, formatter);
        } catch (DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data inválido. Use DD/MM/AAAA.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (horaAtualStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Hora não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (!horaAtualStr.matches("^([01]\\d|2[0-3]):([0-5]\\d)$")) {
            JOptionPane.showMessageDialog(this, "Formato de Hora inválido. Use HH:mm.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(this, "Hóspede adicionado com sucesso!\n" +
                                             "ID: " + id + "\n" +
                                             "Nome: " + nomeCompleto + "\n" +
                                             "Sexo: " + sexoSelecionado,
                                             "Sucesso", JOptionPane.INFORMATION_MESSAGE);
        try {
            TelaQuartos telaQuartos = new TelaQuartos();
            telaQuartos.setVisible(true);
            this.dispose();
        } catch (Exception ex) {
            logger.log(java.util.logging.Level.SEVERE, "Erro ao abrir TelaQuartos", ex);
            JOptionPane.showMessageDialog(this, "Erro ao carregar a tela de Quartos: " + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaCadastro.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaCadastro.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaCadastro.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaCadastro.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TelaCadastro().setVisible(true);
            }
        });
    }

    // Variáveis de declaração - NÃO MODIFIQUE
    private javax.swing.JPanel FormularioGeral;
    private javax.swing.JTextField IDFilde;
    private javax.swing.JButton IDLimparBN;
    private javax.swing.JLabel Logo;
    private javax.swing.JPanel PainelGeralJPAINEL;
    private javax.swing.JButton btnAdicionarActionPerformed;
    private javax.swing.JButton btnAtualizarActionPerformed;
    private javax.swing.JButton btnExcluirActionPerformed;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton10;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButton5;
    private javax.swing.JButton jButton6;
    private javax.swing.JButton jButton9;
    private javax.swing.JFormattedTextField jFormattedTextField1;
    private javax.swing.JFormattedTextField jFormattedTextField2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabelDate;
    private javax.swing.JRadioButton jRadioButton1;
    private javax.swing.JRadioButton jRadioButton2;
    private javax.swing.JRadioButton jRadioButton3;
    private javax.swing.JTextField jTextField5;
    private javax.swing.JTextField jTextField6;
    private javax.swing.JTextField jTextFieldBilhere;
    private javax.swing.JTextField jTextFieldDataNasc;
    private javax.swing.JTextField jTextFieldNome;
    private javax.swing.JTextField jTextFieldTelefone;
    private javax.swing.JLabel lbID;
    private javax.swing.JLabel lbSexo;
    private javax.swing.JLabel txDataNasc;
    private javax.swing.JLabel txNºBilhetePassaport;
    private javax.swing.JLabel txNomeCompleto;
    // Fim da declaração de variáveis
}

Principais alterações e pontos a verificar:

  1. Código no jButton9ActionPerformed:

    Java
    private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {
        // Código para voltar para a tela principal (Home)
        try {
            // Supondo que a sua tela principal se chame 'TelaPrincipal'
            // Se tiver outro nome (ex: TelaHome, MenuPrincipal), altere aqui:
            TelaPrincipal telaPrincipal = new TelaPrincipal(); // Crie uma nova instância da tela principal
            telaPrincipal.setVisible(true); // Torne a tela principal visível
            this.dispose(); // Fecha a tela de Cadastro atual
        } catch (Exception ex) {
            logger.log(java.util.logging.Level.SEVERE, "Erro ao abrir a Tela Principal", ex);
            JOptionPane.showMessageDialog(this, "Erro ao carregar a tela principal: " + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    • Você precisa substituir TelaPrincipal pelo nome real da sua classe da tela inicial. Por exemplo, se a sua tela inicial se chama TelaHome, você usaria TelaHome telaPrincipal = new TelaHome();.
    • Certifique-se de que a classe da sua tela inicial (TelaPrincipal ou o nome que você usa) esteja no mesmo pacote (telas) ou que você tenha a importação correta no topo do ficheiro (ex: import telas.TelaPrincipal;).
  2. Configuração do MaskFormatter: Eu adicionei os blocos try-catch para a configuração dos MaskFormatters diretamente no initComponents(), conforme o NetBeans deveria gerar ao usar o Designer. Isso garante que as máscaras sejam aplicadas na inicialização.

    Java
    // Configuração do MaskFormatter para jFormattedTextField1 (Data)
    try {
        jFormattedTextField1.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
    } catch (java.text.ParseException ex) {
        logger.log(java.util.logging.Level.SEVERE, "Erro ao configurar MaskFormatter para Data", ex);
    }
    
    // ... (restante do código)
    
    // Configuração do MaskFormatter para jFormattedTextField2 (Hora)
    try {
        jFormattedTextField2.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##:##")));
    } catch (java.text.ParseException ex) {
        logger.log(java.util.logging.Level.SEVERE, "Erro ao configurar MaskFormatter para Hora", ex);
    }
    
    • É altamente recomendável que você continue a configurar as máscaras via Designer do NetBeans (clicando no campo, Propriedades, Formatter Factory, ..., aba Masks). Isso permite que o NetBeans gere e gerencie este código para você de forma mais robusta. Se o código que você está a ver no initComponents() está diferente, deixe o NetBeans gerá-lo.
  3. Campo de Data de Nascimento: Percebi que você ainda tem jTextFieldDataNasc e jFormattedTextField1 para datas. Certifique-se de que você está a usar o jFormattedTextField1 (o que tem a máscara) para a data de nascimento no seu formulário e no seu código de validação. Se txDataNasc (o label) se refere a jTextFieldDataNasc, e você quer que ele tenha máscara, você deve alterar jTextFieldDataNasc para ser um JFormattedTextField também, ou usar jFormattedTextField1 para essa função.

    No seu código btnAdicionarActionPerformed, eu comentei as duas opções. Você deve usar apenas uma:

    • String dataNascimentoStr = jTextFieldDataNasc.getText().trim(); (se a data de nascimento for o campo simples)
    • String dataNascimentoStr = jFormattedTextField1.getText().trim(); (se a data de nascimento for o campo formatado)

Para aplicar:

  1. Abra o seu ficheiro TelaCadastro.java no NetBeans.
  2. Vá para a aba "Source" (Código).
  3. Localize o método jButton9ActionPerformed.
  4. Substitua o conteúdo atual daquele método pelo código que eu forneci acima, certificando-se de alterar TelaPrincipal para o nome da sua tela inicial.
  5. Verifique se os blocos try-catch para os MaskFormatters (jFormattedTextField1 e jFormattedTextField2) estão presentes no seu initComponents(). Se não estiverem, adicione-os (ou redefina via Designer para que o NetBeans os adicione).
  6. Ajuste a linha String dataNascimentoStr = ... no btnAdicionarActionPerformed para referenciar o campo de data de nascimento correto que você está usando.
  7. Salve tudo (Ctrl+S).
  8. Limpe e Construa (Clean and Build) o seu projeto.
  9. Execute o projeto para testar o botão "Voltar".

Isso deve fazer com que o botão "Voltar" funcione conforme o esperado, levando o utilizador de volta para a tela principal da sua aplicação.

nos camos se sexo so pode selecionar 1

Com certeza! O comportamento padrão para os botões de rádio (JRadioButtons) é que apenas um deles possa ser selecionado por vez em um grupo. Para conseguir isso, você precisa agrupá-los usando um ButtonGroup.

Como fazer no NetBeans (modo Design):

  1. Arraste um Button Group da paleta de componentes para o seu formulário.

    • Na paleta "Swing Controls" ou "Swing Containers" (geralmente à direita no NetBeans), procure por Button Group.
    • Arraste-o e solte-o em qualquer lugar do seu formulário. Ele não é um componente visual, então não aparecerá na interface, mas aparecerá na janela "Navigator" (Navegador) na parte inferior esquerda.
  2. Adicione os JRadioButtons ao ButtonGroup:

    • Selecione o primeiro JRadioButton (por exemplo, jRadioButton1 - "Feminino").
    • No painel "Properties" (Propriedades), procure a propriedade buttonGroup.
    • Clique na seta suspensa e selecione o buttonGroup1 (ou o nome que o NetBeans deu ao seu ButtonGroup).
    • Repita este passo para os outros JRadioButtons (jRadioButton2 - "Masculino" e jRadioButton3 - "Outros"), atribuindo-os ao mesmo buttonGroup1.
  3. Salve e execute:

    • Salve o seu ficheiro (Ctrl+S).
    • Limpe e Construa (Clean and Build) o projeto (Run -> Clean and Build Project).
    • Execute a sua aplicação.

Agora, quando você testar, verá que ao selecionar um dos botões de rádio, os outros serão automaticamente desmarcados, garantindo que apenas uma opção de sexo possa ser escolhida.

Explicação (o que o NetBeans faz por trás):

Quando você atribui JRadioButtons a um ButtonGroup, o NetBeans gera código semelhante a este no método initComponents():

Java
// Dentro de initComponents() ou em algum método de inicialização
// ...

buttonGroup1 = new javax.swing.ButtonGroup(); // Declara e inicializa o ButtonGroup

buttonGroup1.add(jRadioButton1); // Adiciona o JRadioButton "Feminino" ao grupo
buttonGroup1.add(jRadioButton2); // Adiciona o JRadioButton "Masculino" ao grupo
buttonGroup1.add(jRadioButton3); // Adiciona o JRadioButton "Outros" ao grupo

// ... o restante do seu código para os componentes visuais

É o ButtonGroup que gerencia a seleção exclusiva entre os JRadioButtons que são adicionados a ele.

eu nao setsou a ver as opcoes

Você está a referir-se a não conseguir ver as opções do Button Group no painel de propriedades do NetBeans, certo?

Isso geralmente acontece quando:

  1. O Button Group não foi adicionado ao formulário: Você precisa arrastar e soltar um Button Group da paleta de componentes para a sua janela de design. Ele não é visível na sua tela de design, mas deve aparecer no "Navigator".
  2. O JRadioButton não está selecionado: As propriedades só aparecem para o componente selecionado.
  3. O painel "Properties" não está visível ou está configurado de forma diferente: Às vezes o NetBeans pode ter as janelas reorganizadas.

Vamos verificar passo a passo, usando o Navigator (Navegador) que é a forma mais fiável de ver os componentes invisíveis:

Passo a passo para verificar e adicionar o Button Group:

  1. Abra o seu TelaCadastro.java no NetBeans no modo Design.

  2. Verifique a janela "Navigator" (Navegador).

    • Geralmente, está localizada no canto inferior esquerdo do NetBeans, abaixo da janela "Projects". Se não a vir, vá em Window -> Navigator no menu superior.
    • No "Navigator", você verá uma árvore de todos os componentes do seu formulário. Procure na raiz da sua árvore (geralmente o nome do seu JFrame, no seu caso TelaCadastro ou FormularioGeral) por algo como buttonGroup1 ou buttonGroup2 (o NetBeans atribui um nome padrão).
    • Se você vir um buttonGroup, significa que ele já foi adicionado. Pule para o passo 4.
    • Se você NÃO vir um buttonGroup, precisa adicioná-lo.
  3. Adicionar o Button Group (se não estiver lá):

    • Vá para a "Palette" (Paleta de Componentes), que geralmente está à direita.
    • Expanda a categoria "Swing Controls" ou "Swing Containers".
    • Procure por Button Group.
    • Arraste o Button Group da paleta e solte-o em qualquer lugar da sua janela de design (do seu formulário). Como ele não é um componente visual, ele não aparecerá na tela, mas você deve vê-lo aparecer no "Navigator".
  4. Atribuir os JRadioButtons ao Button Group:

    • Na sua janela de design, clique para selecionar o primeiro JRadioButton (por exemplo, "Feminino" - jRadioButton1).
    • Agora, vá para o painel "Properties" (Propriedades), que geralmente está no canto inferior direito. Se não o vir, vá em Window -> Properties.
    • No painel "Properties", role para baixo ou use a barra de pesquisa para encontrar a propriedade buttonGroup.
    • Ao lado da propriedade buttonGroup, você verá um campo com uma seta para baixo. Clique nesta seta.
    • Um menu suspenso deve aparecer, mostrando o buttonGroup que você adicionou (por exemplo, buttonGroup1). Selecione o buttonGroup1 (ou o nome que o NetBeans deu a ele).
  5. Repita para os outros JRadioButtons:

    • Selecione jRadioButton2 ("Masculino") e atribua-o ao MESMO buttonGroup1 na propriedade buttonGroup.
    • Selecione jRadioButton3 ("Outros") e atribua-o ao MESMO buttonGroup1 na propriedade buttonGroup.
  6. Salve e teste:

    • Salve o ficheiro (Ctrl+S).
    • Clean and Build Project (Run -> Clean and Build Project).
    • Run Project.

Agora, ao executar a aplicação, você deve conseguir selecionar apenas um dos botões de rádio por vez.

Se mesmo seguindo estes passos você não vir as opções ou o Button Group no Navigator, pode ser um problema com a instalação do NetBeans ou uma corrupção do projeto, mas isso é mais raro. Por favor, tente os passos acima com atenção e diga-me onde exatamente você encontra a dificuldade.

Ah, agora sim consigo ver o que está a acontecer! A imagem "Captura de ecrã de 2025-06-18 12-15-09.jpg" é muito útil.

Você está no sítio certo! Na imagem, vejo que:

  1. No "Navigator" (canto inferior esquerdo), você tem um buttonGroup1. Isso significa que o Button Group já foi adicionado com sucesso ao seu formulário.
  2. Você selecionou o jRadioButton1 ("Feminino").
  3. No painel "Properties" (canto inferior direito), você está a ver a propriedade buttonGroup.
  4. A seta suspensa ao lado da propriedade buttonGroup está a mostrar a opção buttonGroup1 (ButtonGroup) selecionada!

Isso é exatamente o que eu esperava ver! Pela imagem, o jRadioButton1 ("Feminino") já está associado ao buttonGroup1.

O próximo passo é repetir isso para os outros dois JRadioButtons (jRadioButton2 "Masculino" e jRadioButton3 "Outros").

  1. Selecione o jRadioButton2 ("Masculino") na sua janela de design.
  2. Vá para o painel "Properties" e, na propriedade buttonGroup, clique na seta suspensa e selecione buttonGroup1.
  3. Repita o mesmo para o jRadioButton3 ("Outros"): selecione-o e atribua-o ao MESMO buttonGroup1.

Depois de fazer isso para os três botões de rádio:

  1. Salve o ficheiro (Ctrl+S).
  2. Limpe e Construa (Clean and Build) o seu projeto (Run -> Clean and Build Project).
  3. Execute o projeto.

Agora, ao executar, você só conseguirá selecionar uma das opções de sexo por vez.

A imagem mostra que você está a seguir os passos corretamente. Continue assim!

so que ja fiz isso mas nao esta a ser exibido a exucao

Entendi. Pela "Captura de ecrã de 2025-06-18 12-18-43.jpg", vejo a sua aplicação a correr e, de facto, os campos de Data e Hora (jFormattedTextField1 e jFormattedTextField2) não estão a mostrar as barras e os dois pontos automaticamente (__/__/____ e __:__).

Você mencionou que já fez o processo de configuração do Formatter Factory, e a imagem anterior ("Captura de ecrã de 2025-06-18 12-15-09.jpg") mostrava que o jFormattedTextField1 estava configurado corretamente para a máscara HH:mm (apesar de ser para um campo de data, o que foi um erro de tipo de máscara, mas a configuração estava a ser aplicada).

A persistência do problema, mesmo após a configuração e o "Clean and Build", sugere as seguintes possibilidades:

  1. Cache do NetBeans/Problema de Recompilação: Embora "Clean and Build" devesse resolver isso, por vezes, o NetBeans pode ter caches teimosas.

    • Solução:
      • Feche o NetBeans completamente e abra-o novamente.
      • Faça um "Clean and Build" de novo.
  2. Múltiplas Declarações ou Sobrescrita no Código:

    • É possível que, em algum lugar do seu código, esses JFormattedTextFields estejam a ser declarados ou configurados novamente, sobrescrevendo a configuração do Formatter Factory.
    • Solução:
      • Vá para a aba "Source" (Código) do seu TelaCadastro.java.
      • Procure por todas as ocorrências de jFormattedTextField1 e jFormattedTextField2 fora do bloco initComponents() ou em outros lugares que possam redefinir suas propriedades.
      • No initComponents(), procure especificamente pelas linhas que configuram o Formatter Factory:
        Java
        try {
            jFormattedTextField1.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
        } catch (java.text.ParseException ex) {
            ex.printStackTrace();
        }
        // E para o jFormattedTextField2
        try {
            jFormattedTextField2.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##:##")));
        } catch (java.text.ParseException ex) {
            ex.printStackTrace();
        }
        
      • Verifique se essas linhas estão presentes e corretas no seu initComponents(). Se não estiverem, adicione-as.
      • Verifique se essas linhas estão duplicadas em algum outro lugar. Devem estar apenas no initComponents().
  3. Campo Errado Sendo Visualizado/Editado:

    • Revise cuidadosamente se o campo que você está a testar (jFormattedTextField1 para data e jFormattedTextField2 para hora) é o mesmo campo que você configurou no NetBeans. Pode haver outros JTextFields na sua interface que parecem semelhantes, mas não são os JFormattedTextFields. A "Captura de ecrã de 2025-06-18 12-18-43.jpg" mostra um JTextField simples acima do campo "Data" (jFormattedTextField1) com o rótulo "DataNasc".
    • Solução: Confirme se os labels "Data" e "Hora" estão associados aos JFormattedTextFields corretos. O txDataNasc no seu código ainda aponta para um JTextFieldDataNasc, e você tem um jFormattedTextField1 para "Data". Certifique-se de que a validação e o uso dos dados estejam vindo dos campos formatados.
  4. Problema com a Versão do SDK/Biblioteca:

    • Você mencionou que está a usar o SDK 52. Isso é uma versão muito nova e pode haver alguma incompatibilidade ou mudança subtil na forma como os MaskFormatters interagem com as versões mais recentes do Swing. Embora seja improvável para um recurso tão básico, é uma possibilidade remota.
    • Solução: Não há uma solução fácil aqui além de tentar uma versão ligeiramente mais antiga do SDK Java (como JDK 17 ou 21 LTS) para testar se o problema persiste, mas isso geralmente não é necessário para MaskFormatter.

Ação Recomendada (Passo a Passo de Verificação):

  1. Confirmação Visual no Designer:

    • Abra a TelaCadastro.java no modo Design.
    • Clique em jFormattedTextField1 (o campo de Data).
    • Nas Propriedades, verifique Formatter Factory. A caixa de texto deve mostrar algo como DefaultFormatterFactory(...) e, se clicar no ..., na aba "Masks", deve ver ##/##/####.
    • Faça o mesmo para jFormattedTextField2 (o campo de Hora) e verifique se a máscara é ##:##.
    • Se qualquer um deles não estiver correto, corrija-o novamente pelo Designer e salve.
  2. Verificação do Código Fonte:

    • Vá para a aba "Source".
    • Procure por initComponents() e dentro dele, verifique se as linhas para jFormattedTextField1.setFormatterFactory(...) e jFormattedTextField2.setFormatterFactory(...) existem e estão corretas.
    • Procure por quaisquer outras linhas que tentem definir o texto ou o formatador desses campos em outros lugares (fora do initComponents() ou em listeners de eventos que não deveriam).
  3. Limpeza Profunda e Reinício:

    • No NetBeans, vá em File -> Close All Projects.
    • Vá em Run -> Clean and Build Project para o seu projeto SistemaGestaoHoteleiro.
    • Feche o NetBeans completamente.
    • Abra o NetBeans novamente e abra o seu projeto.
    • Execute a aplicação e teste.

Se, após estas etapas, as máscaras ainda não aparecerem na execução, por favor, me diga. Se possível, compartilhe o código completo do seu TelaCadastro.java (a aba "Source"), pois assim posso analisar se há algo a sobrescrever a configuração.

estou a falar da opcao sexo

Ah, lamento o mal-entendido! Você está a falar da opção de sexo, onde apenas um dos botões deve ser selecionável, e não das máscaras dos campos de data e hora. A imagem "Captura de ecrã de 2025-06-18 12-18-43.jpg" mostra a sua aplicação a correr com os três botões de rádio ("Feminino", "Masculino", "Outros") para o Sexo.

Pelo que discutimos anteriormente e pela imagem "Captura de ecrã de 2025-06-18 12-15-09.jpg", você já adicionou um ButtonGroup (buttonGroup1) e atribuiu o jRadioButton1 ("Feminino") a ele.

Para garantir que apenas um botão de rádio do sexo possa ser selecionado por vez, você precisa atribuir os outros dois JRadioButtons ao MESMO ButtonGroup.

Passo a passo para corrigir a seleção de sexo (o que você já começou a fazer):

  1. Abra o seu TelaCadastro.java no NetBeans no modo Design.

  2. Verifique se o Button Group está no "Navigator".

    • No painel "Navigator" (geralmente inferior esquerdo), procure por buttonGroup1 (ou o nome que o NetBeans deu ao seu ButtonGroup). Pela imagem "Captura de ecrã de 2025-06-18 12-15-09.jpg", ele já está lá.
  3. Atribua os JRadioButtons ao Button Group:

    • Na sua janela de design, clique para selecionar o jRadioButton2 ("Masculino").

    • Vá para o painel "Properties" (Propriedades), geralmente no canto inferior direito.

    • Procure a propriedade buttonGroup.

    • Clique na seta suspensa ao lado de buttonGroup e selecione buttonGroup1.

    • Repita o mesmo para o jRadioButton3 ("Outros"):

      • Selecione o jRadioButton3 na sua janela de design.
      • No painel "Properties", na propriedade buttonGroup, clique na seta suspensa e selecione buttonGroup1 novamente.
  4. Salve e teste:

    • Salve o seu ficheiro (Ctrl+S).
    • Limpe e Construa (Clean and Build) o seu projeto: Vá em Run -> Clean and Build Project no menu superior do NetBeans.
    • Execute o projeto.

Agora, quando você clicar em "Feminino", "Masculino" ou "Outros", apenas um deles deve permanecer selecionado por vez. Se um já estiver selecionado e você clicar noutro, o anterior será desmarcado automaticamente.

Certo! Pela "Captura de ecrã de 2025-06-18 12-21-16.png", consigo ver claramente a estrutura dos seus componentes no "Navigator" do NetBeans.

O que eu vejo é:

  • Você tem um buttonGroup1.
  • Dentro do buttonGroup1, você tem o jRadioButton1, jRadioButton2 e jRadioButton3 listados.

Isso significa que você já fez o agrupamento corretamente! O NetBeans já associou os três JRadioButtons ao buttonGroup1. O facto de eles estarem aninhados sob buttonGroup1 no "Navigator" confirma isso.

Se mesmo assim, ao executar a aplicação, você consegue selecionar mais de uma opção de sexo, então as únicas explicações possíveis são:

  1. Ainda há um problema de recompilação ou cache do NetBeans. Mesmo que o "BUILD SUCCESSFUL" apareça, por vezes, as alterações não são totalmente refletidas.

    • Solução:
      • Vá em File -> Close All Projects no NetBeans.
      • Feche o NetBeans completamente.
      • Abra o NetBeans novamente.
      • Abra o seu projeto SistemaGestaoHoteleiro.
      • Vá em Run -> Clean and Build Project para garantir uma recompilação completa.
      • Execute o projeto novamente (Run -> Run Project).
  2. Você tem JRadioButtons duplicados na sua interface.

    • Às vezes, um componente pode ser copiado e colado acidentalmente, e você pode estar a interagir com um conjunto de botões que não está no grupo, enquanto o conjunto que está no grupo está escondido ou não visível.
    • Solução: Revise cuidadosamente o seu formulário no modo Design para ver se não há JRadioButtons extras ou sobrepostos na área do Sexo.
  3. Há algum código que está a interferir com a seleção.

    • Menos provável, mas se houver algum listener de evento (ActionListener) nos seus JRadioButtons que esteja a manipular a seleção de forma errada, isso poderia causar o problema.
    • Solução: No modo "Source", verifique o código associado aos jRadioButton1, jRadioButton2 e jRadioButton3. Remova qualquer actionPerformed que você possa ter adicionado a eles, a menos que ele execute uma lógica específica após a seleção, e não tente definir o estado dos outros botões.

A minha aposta é que se trata de um problema de cache ou recompilação. Por favor, tente o passo 1 (fechar o NetBeans, reabrir, Clean and Build) e teste novamente.

Parece que o código que colou foi cortado. No entanto, o trecho initComponents() é suficiente para analisarmos a questão dos botões de rádio e dos campos formatados.

Analisando o seu código Java (especificamente o método initComponents()):

Java
// ...
buttonGroup1 = new javax.swing.ButtonGroup();
jRadioButton1 = new javax.swing.JRadioButton();
jRadioButton2 = new javax.swing.JRadioButton();
jRadioButton3 = new javax.swing.JRadioButton();
// ...

jRadioButton1.setBackground(new java.awt.Color(102, 102, 255));
buttonGroup1.add(jRadioButton1); // <-- Aqui está adicionado!
jRadioButton1.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
jRadioButton1.setText("Femenino");

jRadioButton2.setBackground(new java.awt.Color(102, 102, 255));
buttonGroup1.add(jRadioButton2); // <-- Aqui está adicionado!
jRadioButton2.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
jRadioButton2.setText("Masculino");
jRadioButton2.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jRadioButton2ActionPerformed(evt);
    }
});

jRadioButton3.setBackground(new java.awt.Color(102, 102, 0));
buttonGroup1.add(jRadioButton3); // <-- Aqui está adicionado!
jRadioButton3.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
jRadioButton3.setText("Outros");

// ...

try {
    jFormattedTextField1.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
} catch (java.text.ParseException ex) {
    ex.printStackTrace();
}
jFormattedTextField1.setHorizontalAlignment(javax.swing.JTextField.CENTER);

// ...

try {
    jFormattedTextField2.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##:##")));
} catch (java.text.ParseException ex) {
    ex.printStackTrace();
}
jFormattedTextField2.setHorizontalAlignment(javax.swing.JTextField.CENTER);
jFormattedTextField2.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jFormattedTextField2ActionPerformed(evt);
    }
});

Confirmação do Código:

  • JRadioButtons (Sexo): O seu código está correto para o agrupamento dos botões de rádio. As linhas buttonGroup1.add(jRadioButtonX); para todos os três botões estão lá, o que significa que o ButtonGroup está a gerir a seleção exclusiva. Se mesmo assim você conseguir selecionar mais de um, a causa definitivamente não está no código gerado para o ButtonGroup.

  • JFormattedTextFields (Data e Hora): O código para definir o FormatterFactory para jFormattedTextField1 (Data: ##/##/####) e jFormattedTextField2 (Hora: ##:##) também está correto.

Então, se o problema ainda persiste na execução (consegue selecionar múltiplos sexos, ou as máscaras não aparecem), as hipóteses mais prováveis são:

  1. Cache do NetBeans / Recompilação Incompleta (Muito Comum):

    • Este é o cenário mais frequente. O NetBeans, por vezes, não reflete todas as alterações imediatamente, mesmo após um "Build".
    • Ação:
      • Feche o NetBeans COMPLETAMENTE. Não apenas feche o projeto, mas feche o IDE.
      • Reabra o NetBeans.
      • Abra o seu projeto (SistemaGestaoHoteleiro).
      • Vá em Run -> Clean and Build Project. (Certifique-se de que vê "BUILD SUCCESSFUL" na janela de Output).
      • Vá em Run -> Run Project ou use o botão de play verde.
  2. Duplicação de Componentes na Interface:

    • Embora o código gerado esteja correto, é possível que no modo Design você tenha arrastado e soltado novos JRadioButtons ou JFormattedTextFields acidentalmente e estes não estejam ligados ao mesmo ButtonGroup ou não tenham as máscaras aplicadas. O código gerado é para os componentes com os nomes jRadioButton1, jRadioButton2, jRadioButton3, jFormattedTextField1, jFormattedTextField2.
    • Ação:
      • No modo Design do TelaCadastro.java, selecione um dos JRadioButtons e observe o nome no painel "Properties" (propriedade code -> Variable Name). Confirme que são jRadioButton1, jRadioButton2 e jRadioButton3.
      • Faça o mesmo para os campos de data e hora, confirmando que são jFormattedTextField1 e jFormattedTextField2.
      • Selecione cada um dos botões de rádio na área de Sexo e confirme no painel "Properties" se todos eles têm buttonGroup1 selecionado na propriedade buttonGroup.
      • Para os JFormattedTextFields, verifique a propriedade Formatter Factory.
  3. Executando uma Versão Antiga da Aplicação:

    • Verifique se não está a executar uma versão compilada antiga da sua aplicação a partir de outro local (por exemplo, um .jar salvo anteriormente).
    • Ação: Sempre execute o projeto diretamente do NetBeans (Run -> Run Project) após fazer as alterações e recompilar.

Minha forte recomendação é o ponto 1: fechar e reabrir o NetBeans, seguido de um "Clean and Build" completo. Isso resolve a maioria dos problemas "o código está certo, mas não funciona".

ele nao deve estar com o campo sexo?

Sim, ele deve estar com o campo de sexo.

Pelo código que me enviou (TelaCadastro.java) e pelas imagens que anexou (nomeadamente "Captura de ecrã de 2025-06-18 12-21-16.png"), a lógica para o campo de sexo está correta e implementada.

Você tem:

  1. Um ButtonGroup chamado buttonGroup1.
  2. Três JRadioButtons (jRadioButton1, jRadioButton2, jRadioButton3) que foram adicionados a esse buttonGroup1 no método initComponents().

O objetivo de um ButtonGroup é precisamente garantir que, dentro do grupo, apenas um dos JRadioButtons possa estar selecionado por vez.

Se na execução da sua aplicação, você ainda consegue selecionar mais de um botão de rádio para o sexo ao mesmo tempo, apesar do código estar correto, isso significa que um dos cenários que mencionei anteriormente está a acontecer:

  • Cache do NetBeans/Recompilação Incompleta: Esta é a causa mais comum para o comportamento não corresponder ao código.
  • Componentes Duplicados/Sobrepostos: Há uma possibilidade de haver outros JRadioButtons na sua interface que não estão ligados ao buttonGroup1, e você está a interagir com eles.
  • Executando uma Versão Antiga: Você pode estar a executar uma versão desatualizada da sua aplicação.

Por favor, siga estes passos novamente com muito cuidado:

  1. Feche o NetBeans por completo. (Vá em File -> Exit ou feche a janela principal).
  2. Abra o NetBeans novamente.
  3. Abra o seu projeto SistemaGestaoHoteleiro.
  4. No menu superior, vá em Run -> Clean and Build Project. Espere até que a janela "Output" mostre BUILD SUCCESSFUL.
  5. Vá em Run -> Run Project (ou clique no botão verde de play na barra de ferramentas).

Após fazer isso, teste novamente as opções de sexo na sua aplicação. Se o problema persistir, teremos que investigar se há algum JRadioButton "fantasma" ou outro comportamento inesperado na sua interface.

se voce ver a ;bsexo esta no campo sem os radionBUtton

Certo, entendi perfeitamente agora! A sua observação é crucial.

Na imagem "Captura de ecrã de 2025-06-18 12-18-43.jpg" (onde a aplicação está em execução), o JLabel "Sexo" (lbSexo no seu código) está visível, mas os JRadioButtons ("Feminino", "Masculino", "Outros") não aparecem de todo na interface.

Isso explica por que você não consegue selecionar apenas um, pois eles simplesmente não estão visíveis para serem selecionados!

O código (initComponents()) mostra que os JRadioButtons estão associados ao ButtonGroup, mas eles não estão sendo adicionados ao layout do JPanel onde deveriam aparecer.

O problema é que os JRadioButtons não foram adicionados visualmente ao seu FormularioGeral (ou outro painel onde deveriam estar).

O NetBeans, no modo Design, é suposto gerir o layout automaticamente quando você arrasta e solta componentes. Se você os arrastou para o painário FormularioGeral, eles deveriam ter sido adicionados ao layout.

Como corrigir (adicionar os JRadioButtons ao layout):

  1. Abra o seu TelaCadastro.java no NetBeans no modo Design.

  2. Verifique a área onde o "Sexo" (lbSexo) está. É onde os botões de rádio deveriam estar.

  3. Localize os JRadioButtons no "Navigator" (canto inferior esquerdo).

    • Você deve ver jRadioButton1, jRadioButton2, jRadioButton3 listados sob buttonGroup1.
  4. Arraste os JRadioButtons do "Navigator" para o seu FormularioGeral (ou o painel correto):

    • Clique e arraste jRadioButton1 do "Navigator" para a área visual onde o "Sexo" está na sua tela de design. Coloque-o ao lado do lbSexo.
    • Repita o processo para jRadioButton2 e jRadioButton3, colocando-os ao lado do primeiro, um ao lado do outro, ou um abaixo do outro, dependendo de como deseja o layout.

    À medida que os arrasta, o NetBeans deve ajustar o layout (FormularioGeralLayout.setHorizontalGroup e FormularioGeralLayout.setVerticalGroup no seu código) para incluir esses componentes.

  5. Verifique o initComponents() novamente (aba "Source"):

    • Depois de arrastar e soltar, o NetBeans deve ter adicionado linhas ao seu FormularioGeralLayout para incluir jRadioButton1, jRadioButton2 e jRadioButton3. Elas devem ser algo parecido com:
      Java
      FormularioGeralLayout.setHorizontalGroup(
          FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
          .addGroup(FormularioGeralLayout.createSequentialGroup()
              // ... outras coisas de layout
              .addComponent(lbSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) // ou outro tipo de espaçamento
              .addComponent(jRadioButton1) // <-- Nova linha
              .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
              .addComponent(jRadioButton2) // <-- Nova linha
              .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
              .addComponent(jRadioButton3) // <-- Nova linha
              // ...
      );
      FormularioGeralLayout.setVerticalGroup(
          FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
          .addGroup(FormularioGeralLayout.createSequentialGroup()
              // ... outras coisas de layout
              .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                  .addComponent(lbSexo)
                  .addComponent(jRadioButton1) // <-- Nova linha
                  .addComponent(jRadioButton2) // <-- Nova linha
                  .addComponent(jRadioButton3)) // <-- Nova linha
              // ...
      );
      
  6. Salve tudo (Ctrl+S).

  7. Faça um Clean and Build Project (Run -> Clean and Build Project).

  8. Execute o projeto (Run -> Run Project).

Agora, os JRadioButtons devem aparecer ao lado do "Sexo" na sua interface e o ButtonGroup deve garantir que apenas um possa ser selecionado.

O problema não era com o agrupamento em si, mas com a inclusão dos componentes de rádio no layout visual do formulário. Desculpe, a frase "se voce ver a ;bsexo esta no campo sem os radionBUtton" não ficou clara para mim.

Poderia, por favor, esclarecer o que quer dizer com ";bsexo"? Parece ser um erro de digitação.

No seu código e nas suas capturas de tela, o rótulo para o Sexo é lbSexo, e os botões de rádio são jRadioButton1, jRadioButton2 e jRadioButton3.

Se o seu JLabel (lbSexo) está aparecendo na sua interface, mas os JRadioButtons (jRadioButton1, jRadioButton2, jRadioButton3) não estão visíveis na execução, mesmo que estejam no seu ButtonGroup no código e no Navigator, então o problema é de layout ou visibilidade.

As razões mais comuns para componentes não aparecerem na execução, mesmo estando no código:

  1. Problema de Layout Manager: O layout manager do JPanel onde os botões estão inseridos pode não estar a organizá-los corretamente, fazendo com que fiquem sobrepostos ou fora da área visível.
  2. setVisible(false) ou setEnabled(false) em algum lugar: Embora o NetBeans geralmente não faça isso automaticamente, você pode ter adicionado acidentalmente código que define a visibilidade ou a ativação dos botões como falsa.
  3. Componentes não adicionados ao contêiner correto: Embora o ButtonGroup agrupe a lógica, os JRadioButtons precisam ser adicionados a um JPanel ou JFrame para serem exibidos visualmente. Pelo seu código, eles parecem estar declarados, mas o código para adicioná-los ao FormularioGeral (ou outro painel) está na seção <editor-fold defaultstate="collapsed" desc="Generated Code">, que o NetBeans gerencia no layout.

Para verificar isso, por favor, faça o seguinte no NetBeans:

  1. Abra TelaCadastro.java no modo Design.
  2. Procure a área onde os botões de sexo deveriam estar.
  3. No painel "Navigator" (inferior esquerdo):
    • Expanda o nó FormularioGeral (ou o JPanel principal onde você espera que eles estejam).
    • Dentro de FormularioGeral, confirme que você vê lbSexo, jRadioButton1, jRadioButton2 e jRadioButton3. Se eles não estiverem sob o mesmo painel que o lbSexo, você precisa arrastá-los para lá no modo Design.
  4. No modo Design, clique em cada JRadioButton individualmente:
    • No painel "Properties" (inferior direito), procure pela propriedade Visible. Certifique-se de que está marcada (true).
    • Procure pela propriedade Enabled. Certifique-se de que está marcada (true).
  5. Verifique o layout:
    • Selecione o JPanel onde os JRadioButtons e o lbSexo estão inseridos (provavelmente FormularioGeral).
    • No painel "Properties", veja qual "Layout Manager" está a ser usado. Se for GroupLayout (que é o padrão do NetBeans), ele deve gerir isso. Se for outro, como FlowLayout ou BorderLayout, a forma como você os adiciona e organiza pode ser crucial.

Se tudo isso estiver correto e os botões ainda não aparecerem na execução, por favor, tente:

  • Tirar uma captura de tela do seu formulário no NetBeans no modo Design, mostrando a área onde os botões de sexo deveriam estar, e também uma captura de tela do painel "Navigator" com os nós FormularioGeral e buttonGroup1 expandidos, para que eu possa ver a hierarquia visual. Isso nos ajudaria a identificar se eles estão adicionados ao contêiner certo e na posição esperada.

Excelente! Vamos trabalhar nos botões "Limpar".

Você já tem um método jButton1ActionPerformed que limpa o jTextFieldNome. Vamos replicar essa lógica para os outros campos de texto e também para os JFormattedTextFields e o ButtonGroup de sexo.

No seu código, você tem vários botões "Limpar" nomeados IDLimparBN, jButton1, jButton2, jButton3, jButton4, jButton5, jButton6, e jButton10. Parece que você tem um botão "Limpar" para cada campo, o que é um pouco redundante e pode dificultar a manutenção.

Sugestão:

Seria muito mais eficiente ter um único botão "Limpar Tudo" que limpa todos os campos de uma vez. Isso simplificaria a interface para o utilizador e o código para você.

No entanto, como você mencionou "os botões limpar" (no plural), vou fornecer as ações para cada um, mas recomendo fortemente que você considere a opção de um único botão "Limpar Tudo".


Passo 1: Identificar os JTextFields e JFormattedTextFields correspondentes a cada botão "Limpar"

Baseado no seu código initComponents() e nos seus JLabels:

  • IDLimparBN -> IDFilde (ID)
  • jButton1 -> jTextFieldNome (Nome Completo)
  • jButton2 -> jTextFieldBilhere (Nº Bilhete/Passaport)
  • jButton3 -> jTextFieldDataNasc (DataNasc)
  • jButton4 -> jTextFieldTelefone (Telefone)
  • jButton5 -> jTextField5 (Endereco)
  • jButton10 -> jTextField6 (Numero De Hospedes)
  • jButton6 -> jFormattedTextField1 (Data) e jFormattedTextField2 (Hora), e também o buttonGroup1 (Sexo). Este jButton6 é um bom candidato para ser o seu "Limpar Tudo".

Passo 2: Adicionar os ActionListener e implementar a lógica de limpeza

Você já tem o actionPerformed para jButton1. Vamos adicionar para os outros.

1. Para IDLimparBN (Limpar ID):

Java
private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {                                             
    IDFilde.setText("");
}

2. Para jButton2 (Limpar Nº Bilhete/Passaport):

Java
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                             
    jTextFieldBilhere.setText("");
}

3. Para jButton3 (Limpar DataNasc):

Java
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                             
    jTextFieldDataNasc.setText("");
}

4. Para jButton4 (Limpar Telefone):

Java
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                             
    jTextFieldTelefone.setText("");
}

5. Para jButton5 (Limpar Endereço):

Java
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                             
    jTextField5.setText(""); // jTextField5 é o campo de Endereço
}

6. Para jButton10 (Limpar Número de Hóspedes):

Java
private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) {                                              
    jTextField6.setText(""); // jTextField6 é o campo de Número de Hóspedes
}

7. Para jButton6 (Limpar Data, Hora e Sexo - idealmente, poderia ser o "Limpar Tudo"):

Aqui é importante também limpar a seleção do ButtonGroup.

Java
private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {                                             
    jFormattedTextField1.setText(""); // Limpa o campo de Data
    jFormattedTextField2.setText(""); // Limpa o campo de Hora
    buttonGroup1.clearSelection();    // Desseleciona todos os radio buttons do grupo de sexo
}

Importante: Para que buttonGroup1.clearSelection() funcione, você precisa declarar buttonGroup1 como uma variável de instância (ou seja, fora do initComponents() mas dentro da classe TelaCadastro), para que o método jButton6ActionPerformed possa acessá-lo.

Correção da declaração de buttonGroup1:

Mude: javax.swing.ButtonGroup buttonGroup1 = new javax.swing.ButtonGroup(); para: private javax.swing.ButtonGroup buttonGroup1; na seção de declaração de variáveis da sua classe TelaCadastro (geralmente no final da classe, após os métodos e antes do main).

E no initComponents(), mude: javax.swing.ButtonGroup buttonGroup1 = new javax.swing.ButtonGroup(); para: buttonGroup1 = new javax.swing.ButtonGroup();


Passo 3: Adicionar os ActionListener no initComponents()

Para cada botão que você criou um método ActionPerformed, você precisa adicionar a linha correspondente no initComponents():

Java
// ... dentro de initComponents()

// Para IDLimparBN
IDLimparBN.setText("Limpar");
IDLimparBN.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        IDLimparBNActionPerformed(evt); // Adicione esta linha
    }
});

// ... (jButton1 já está lá)

// Para jButton2
jButton2.setText("Limpar");
jButton2.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jButton2ActionPerformed(evt); // Adicione esta linha
    }
});

// Para jButton3
jButton3.setText("Limpar");
jButton3.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jButton3ActionPerformed(evt); // Adicione esta linha
    }
});

// Para jButton4
jButton4.setText("Limpar");
jButton4.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jButton4ActionPerformed(evt); // Adicione esta linha
    }
});

// Para jButton5
jButton5.setText("Limpar");
jButton5.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jButton5ActionPerformed(evt); // Adicione esta linha
    }
});

// Para jButton10
jButton10.setText("Limpar");
jButton10.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jButton10ActionPerformed(evt); // Adicione esta linha
    }
});

// Para jButton6
jButton6.setText("Limpar");
jButton6.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jButton6ActionPerformed(evt); // Adicione esta linha
    }
});

// ...

Recomendação para um único botão "Limpar Tudo":

Se você decidir ter apenas um botão "Limpar Tudo", pode fazer o seguinte:

  1. Mantenha apenas um botão "Limpar" visível na interface, talvez renomeando-o para "Limpar Todos os Campos".

  2. Remova os outros botões "Limpar" (IDLimparBN, jButton1, etc.) da interface no modo Design.

  3. No actionPerformed desse único botão, chame um novo método limparTodosCampos():

    Java
    private void btnLimparTudoActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        limparTodosCampos();
    }
    
    private void limparTodosCampos() {
        IDFilde.setText("");
        jTextFieldNome.setText("");
        jTextFieldBilhere.setText("");
        jTextFieldDataNasc.setText("");
        jTextFieldTelefone.setText("");
        jTextField5.setText(""); // Endereco
        jTextField6.setText(""); // Numero De Hospedes
        jFormattedTextField1.setText(""); // Data
        jFormattedTextField2.setText(""); // Hora
        buttonGroup1.clearSelection();    // Sexo
    
        // Se tiver mais campos (Ex: JComboBox, JTextArea, etc.), adicione aqui
        // jComboBoxExemplo.setSelectedIndex(-1); // Para JComboBox
        // jTextAreaExemplo.setText(""); // Para JTextArea
    }
    

Isso torna seu código muito mais limpo e fácil de manter.

Escolha a abordagem que melhor se encaixa no seu design!

Entendi que você está trabalhando com um formulário Swing em Java e que o método initComponents() é gerado automaticamente, o que impede a alteração direta do seu conteúdo para adicionar lógica de inicialização ou validação. Você quer adicionar funcionalidade de validação e outras lógicas, como formatação de data e hora, mas precisa fazê-lo fora do initComponents().

Aqui estão as suas opções e como você pode abordar a situação:

1. A Lógica de Validação e Formatação DEVE estar fora de initComponents():

Você já está fazendo isso corretamente no seu método btnAdicionarActionPerformedActionPerformed. O código que verifica se os campos estão vazios, valida o formato da data e do número de hóspedes está no lugar certo.

2. Configurações Iniciais dos Campos (Máscaras, Textos Padrão):

Para configurar máscaras para jFormattedTextField1 (data) e jFormattedTextField2 (hora), você já tem o código dentro de initComponents(). Isso é normal e aceitável, pois são configurações visuais dos componentes.

3. Adicionar Validação de jFormattedTextField1 e jFormattedTextField2 no btnAdicionarActionPerformedActionPerformed:

Assim como você validou jTextFieldDataNasc, você também precisará validar jFormattedTextField1 (data) e jFormattedTextField2 (hora) ao clicar no botão "Adicionar".

Código sugerido para o método btnAdicionarActionPerformedActionPerformed (com foco nas validações de data e hora):

Java
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
package telas;

import javax.swing.JOptionPane;
import java.time.LocalDate; // Adicione esta importação para trabalhar com datas
import java.time.format.DateTimeFormatter; // Adicione esta importação
import java.time.format.DateTimeParseException; // Adicione esta importação
import java.time.LocalTime; // Importação para LocalTime

/**
 *
 * @author mcdebug
 */
public class TelaCadastro extends javax.swing.JFrame {

    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadastro.class.getName());

    /**
     * Creates new form TelaCadastro
     */
    public TelaCadastro() {
        initComponents();
        // Você pode chamar um método de inicialização personalizado aqui, se necessário.
        // Por exemplo, para definir datas/horas padrão, ou preencher Comboboxes.
        // configureInitialData(); 
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        javax.swing.ButtonGroup buttonGroup1 = new javax.swing.ButtonGroup();
        PainelGeralJPAINEL = new javax.swing.JPanel();
        FormularioGeral = new javax.swing.JPanel();
        Logo = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        lbID = new javax.swing.JLabel();
        txNomeCompleto = new javax.swing.JLabel();
        txNºBilhetePassaport = new javax.swing.JLabel();
        txDataNasc = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        IDFilde = new javax.swing.JTextField();
        IDLimparBN = new javax.swing.JButton();
        LimparNome = new javax.swing.JButton();
        jTextFieldNome = new javax.swing.JTextField();
        jTextFieldBilhere = new javax.swing.JTextField();
        jTextFieldDataNasc = new javax.swing.JTextField();
        jTextFieldTelefone = new javax.swing.JTextField();
        jTextField5 = new javax.swing.JTextField();
        LimparBilhete = new javax.swing.JButton();
        LimparDataNasci = new javax.swing.JButton();
        LimparTelefone = new javax.swing.JButton();
        LimparEndereco = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        btnAdicionarActionPerformed = new javax.swing.JButton();
        btnAtualizarActionPerformed = new javax.swing.JButton();
        btnExcluirActionPerformed = new javax.swing.JButton();
        jTextField6 = new javax.swing.JTextField();
        jButton9 = new javax.swing.JButton();
        jButton10 = new javax.swing.JButton();
        lbSexo = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        jRadioButton3 = new javax.swing.JRadioButton();
        jLabelDate = new javax.swing.JLabel();
        jFormattedTextField1 = new javax.swing.JFormattedTextField();
        LimparData = new javax.swing.JButton();
        jFormattedTextField2 = new javax.swing.JFormattedTextField();
        jLabel3 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        Logo.setFont(new java.awt.Font("Liberation Sans", 0, 24)); // NOI18N
        Logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        jLabel2.setFont(new java.awt.Font("Liberation Sans", 1, 36)); // NOI18N
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setText("Cadastro Hóspedes");
        jLabel2.setAlignmentX(0.5F);

        lbID.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        lbID.setText("ID");

        txNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNomeCompleto.setText("Nome Completo");

        txNºBilhetePassaport.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txNºBilhetePassaport.setText("Nº Bilhete/Passaport");

        txDataNasc.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        txDataNasc.setText("DataNasc");

        jLabel6.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jLabel6.setText("Telefone");

        jLabel7.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jLabel7.setText("Endereco");

        IDLimparBN.setText("Limpar");

        LimparNome.setText("Limpar");
        LimparNome.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                LimparNomeActionPerformed(evt);
            }
        });

        LimparBilhete.setText("Limpar");

        LimparDataNasci.setText("Limpar");

        LimparTelefone.setText("Limpar");

        LimparEndereco.setText("Limpar");

        jLabel1.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jLabel1.setText("Numero De Hospedes");

        btnAdicionarActionPerformed.setText("Adicionar");
        btnAdicionarActionPerformed.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAdicionarActionPerformedActionPerformed(evt);
            }
        });

        btnAtualizarActionPerformed.setText("Atualizar");
        btnAtualizarActionPerformed.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAtualizarActionPerformedActionPerformed(evt);
            }
        });

        btnExcluirActionPerformed.setText("Excluir");
        btnExcluirActionPerformed.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExcluirActionPerformedActionPerformed(evt);
            }
        });

        jButton9.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        jButton9.setText("Voltar");
        jButton9.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 15, 10, 15));
        jButton9.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton9ActionPerformed(evt);
            }
        });

        jButton10.setText("Limpar");

        lbSexo.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        lbSexo.setText("Sexo");

        jRadioButton1.setBackground(new java.awt.Color(255, 51, 0));
        buttonGroup1.add(jRadioButton1);
        jRadioButton1.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jRadioButton1.setText("Femenino");

        jRadioButton2.setBackground(new java.awt.Color(255, 51, 0));
        buttonGroup1.add(jRadioButton2);
        jRadioButton2.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jRadioButton2.setText("Masculino");
        jRadioButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton2ActionPerformed(evt);
            }
        });

        jRadioButton3.setBackground(new java.awt.Color(255, 51, 51));
        buttonGroup1.add(jRadioButton3);
        jRadioButton3.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jRadioButton3.setText("Outros");

        jLabelDate.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jLabelDate.setText("Data");

        try {
            jFormattedTextField1.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
        } catch (java.text.ParseException ex) {
            ex.printStackTrace();
        }
        jFormattedTextField1.setHorizontalAlignment(javax.swing.JTextField.CENTER);

        LimparData.setText("Limpar");

        try {
            jFormattedTextField2.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##:##")));
        } catch (java.text.ParseException ex) {
            ex.printStackTrace();
        }
        jFormattedTextField2.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        jFormattedTextField2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jFormattedTextField2ActionPerformed(evt);
            }
        });

        jLabel3.setFont(new java.awt.Font("Liberation Sans", 1, 14)); // NOI18N
        jLabel3.setText("Hora");

        javax.swing.GroupLayout FormularioGeralLayout = new javax.swing.GroupLayout(FormularioGeral);
        FormularioGeral.setLayout(FormularioGeralLayout);
        FormularioGeralLayout.setHorizontalGroup(
            FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(FormularioGeralLayout.createSequentialGroup()
                .addContainerGap(32, Short.MAX_VALUE)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(FormularioGeralLayout.createSequentialGroup()
                                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jLabel7)
                                    .addComponent(jLabel6)
                                    .addComponent(txDataNasc)
                                    .addComponent(jLabel1)
                                    .addComponent(txNºBilhetePassaport)
                                    .addComponent(txNomeCompleto)
                                    .addComponent(lbID)
                                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                                        .addComponent(jLabelDate, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(36, 36, 36)
                                        .addComponent(jFormattedTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addComponent(btnExcluirActionPerformed, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(LimparNome)
                                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                        .addGroup(FormularioGeralLayout.createSequentialGroup()
                                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                                .addComponent(IDFilde)
                                                .addComponent(jTextFieldNome, javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(jTextFieldDataNasc, javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(jTextFieldTelefone, javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(jTextField5)
                                                .addComponent(jTextField6, javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(jTextFieldBilhere, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE))
                                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addGroup(FormularioGeralLayout.createSequentialGroup()
                                                    .addGap(56, 56, 56)
                                                    .addComponent(IDLimparBN))
                                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                        .addComponent(LimparBilhete, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(LimparDataNasci, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(LimparTelefone, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(LimparEndereco, javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(jButton10, javax.swing.GroupLayout.Alignment.TRAILING)))))
                                        .addGroup(FormularioGeralLayout.createSequentialGroup()
                                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(jRadioButton1)
                                                .addGroup(FormularioGeralLayout.createSequentialGroup()
                                                    .addGap(63, 63, 63)
                                                    .addComponent(jLabel3)
                                                    .addGap(27, 27, 27)
                                                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                        .addComponent(jRadioButton2)
                                                        .addComponent(jFormattedTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                                .addGroup(FormularioGeralLayout.createSequentialGroup()
                                                    .addGap(52, 52, 52)
                                                    .addComponent(btnAtualizarActionPerformed, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                            .addGap(49, 49, 49)
                                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(btnAdicionarActionPerformed, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                .addGroup(FormularioGeralLayout.createSequentialGroup()
                                                    .addComponent(jRadioButton3)
                                                    .addGap(0, 0, Short.MAX_VALUE))
                                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                                                    .addGap(0, 0, Short.MAX_VALUE)
                                                    .addComponent(LimparData)))))))
                            .addComponent(lbSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                        .addGap(0, 27, Short.MAX_VALUE)
                        .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 466, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(13, 13, 13))))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel2)
                .addGap(144, 144, 144))
        );
        FormularioGeralLayout.setVerticalGroup(
            FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(FormularioGeralLayout.createSequentialGroup()
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                        .addGap(92, 92, 92)
                        .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(113, 113, 113))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(Logo, javax.swing.GroupLayout.PREFERRED_SIZE, 236, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                        .addComponent(jLabel2)
                        .addGap(28, 28, 28)
                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(IDFilde, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(IDLimparBN))
                        .addGap(20, 20, 20))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, FormularioGeralLayout.createSequentialGroup()
                        .addComponent(lbID)
                        .addGap(18, 18, 18)))
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(txNomeCompleto, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextFieldNome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(LimparNome)))
                .addGap(18, 18, 18)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txNºBilhetePassaport)
                    .addComponent(LimparBilhete)
                    .addComponent(jTextFieldBilhere, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txDataNasc)
                    .addComponent(jTextFieldDataNasc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(LimparDataNasci))
                .addGap(26, 26, 26)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel6, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextFieldTelefone, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(LimparTelefone)))
                .addGap(18, 18, 18)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel7)
                    .addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(LimparEndereco))
                .addGap(18, 18, 18)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton10))
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                        .addGap(29, 29, 29)
                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lbSexo)
                            .addComponent(jRadioButton1)
                            .addComponent(jRadioButton3)
                            .addComponent(jRadioButton2)))
                    .addGroup(FormularioGeralLayout.createSequentialGroup()
                        .addGap(87, 87, 87)
                        .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jLabelDate)
                                .addComponent(jFormattedTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(jFormattedTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(jLabel3)
                                .addComponent(LimparData)))))
                .addGap(28, 28, 28)
                .addGroup(FormularioGeralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnAtualizarActionPerformed, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnAdicionarActionPerformed, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnExcluirActionPerformed, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(70, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout PainelGeralJPAINELLayout = new javax.swing.GroupLayout(PainelGeralJPAINEL);
        PainelGeralJPAINEL.setLayout(PainelGeralJPAINELLayout);
        PainelGeralJPAINELLayout.setHorizontalGroup(
            PainelGeralJPAINELLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PainelGeralJPAINELLayout.createSequentialGroup()
                .addGap(76, 76, 76)
                .addComponent(FormularioGeral, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(211, Short.MAX_VALUE))
        );
        PainelGeralJPAINELLayout.setVerticalGroup(
            PainelGeralJPAINELLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PainelGeralJPAINELLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(FormularioGeral, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(PainelGeralJPAINEL, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(PainelGeralJPAINEL, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(59, 59, 59))
        );

        pack();
    }// </editor-fold>

    private void LimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        jTextFieldNome.setText("");
    }

    private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        // Você pode querer limpar o campo de bilhete/passaporte apenas se o sexo for masculino,
        // ou remover esta ação se não for o comportamento desejado.
        jTextFieldBilhere.setText(""); 
    }

    private void btnAtualizarActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
        JOptionPane.showMessageDialog(this, "Funcionalidade de Atualizar ainda não implementada.", "Aviso", JOptionPane.INFORMATION_MESSAGE);
    }

    private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            // Supondo que a sua tela principal se chame 'TelaPrincipal'
            // Se tiver outro nome (ex: TelaHome, MenuPrincipal), altere aqui:
            TelaHome telaHome = new TelaHome(); // Crie uma nova instância da tela principal
            telaHome.setVisible(true); // Torne a tela principal visível
            this.dispose(); // Fecha a tela de Cadastro atual
        } catch (Exception ex) {
            logger.log(java.util.logging.Level.SEVERE, "Erro ao abrir a Tela Principal", ex);
            JOptionPane.showMessageDialog(this, "Erro ao carregar a tela principal: " + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
    }

    private void jFormattedTextField2ActionPerformed(java.awt.event.ActionEvent evt) {
        // Este método pode ser usado para adicionar lógica quando a hora é digitada e o foco é perdido.
        // Por exemplo, validar a hora assim que o usuário termina de digitar.
    }

    private void btnExcluirActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
        JOptionPane.showMessageDialog(this, "Funcionalidade de Excluir ainda não implementada.", "Aviso", JOptionPane.INFORMATION_MESSAGE);
    }

    private void btnAdicionarActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
        String id = IDFilde.getText().trim();
        String nomeCompleto = jTextFieldNome.getText().trim();
        String bilhetePassaporte = jTextFieldBilhere.getText().trim();
        String dataNascimentoStr = jTextFieldDataNasc.getText().trim(); // Note que é jTextFieldDataNasc
        String telefone = jTextFieldTelefone.getText().trim();
        String endereco = jTextField5.getText().trim(); // Observe que é jTextField5 para Endereço
        String numHospedes = jTextField6.getText().trim(); // Observe que é jTextField6 para Numero De Hospedes
        String dataAtualStr = jFormattedTextField1.getText().replace(" ", "").trim(); // Campo de Data, removendo espaços da máscara
        String horaAtualStr = jFormattedTextField2.getText().replace(" ", "").trim(); // Campo de Hora, removendo espaços da máscara

        // Validações de campos vazios
        if (id.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo ID não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (nomeCompleto.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Nome Completo não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (bilhetePassaporte.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Nº Bilhete/Passaporte não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (dataNascimentoStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Data de Nascimento não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (telefone.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Telefone não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (endereco.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Endereço não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (numHospedes.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo Número de Hóspedes não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (dataAtualStr.isEmpty() || dataAtualStr.equals("//")) { // Verifica se a máscara está vazia
            JOptionPane.showMessageDialog(this, "O campo Data não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (horaAtualStr.isEmpty() || horaAtualStr.equals(":")) { // Verifica se a máscara está vazia
            JOptionPane.showMessageDialog(this, "O campo Hora não pode estar vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // Validação da Data de Nascimento (jTextFieldDataNasc)
        try {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
            LocalDate dataNasc = LocalDate.parse(dataNascimentoStr, formatter);
            // Opcional: Adicionar validação para data futura ou idade mínima/máxima
            if (dataNasc.isAfter(LocalDate.now())) {
                JOptionPane.showMessageDialog(this, "Data de Nascimento não pode ser no futuro.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use DD/MM/AAAA.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // Validação do Número de Hóspedes
        try {
            int num = Integer.parseInt(numHospedes);
            if (num <= 0) {
                JOptionPane.showMessageDialog(this, "Número de Hóspedes deve ser um valor positivo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Número de Hóspedes deve ser um número válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // Validação da Data (jFormattedTextField1)
        try {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
            LocalDate dataAtual = LocalDate.parse(dataAtualStr, formatter);
        } catch (DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato da Data inválido. Use DD/MM/AAAA.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // Validação da Hora (jFormattedTextField2)
        try {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
            LocalTime horaAtual = LocalTime.parse(horaAtualStr, formatter);
        } catch (DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato da Hora inválido. Use HH:MM.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // Validação do Sexo
        String sexoSelecionado = "";
        if (jRadioButton1.isSelected()) {
            sexoSelecionado = "Feminino";
        } else if (jRadioButton2.isSelected()) {
            sexoSelecionado = "Masculino";
        } else if (jRadioButton3.isSelected()) {
            sexoSelecionado = "Outros";
        }
        if (sexoSelecionado.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Selecione o Sexo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // Se todas as validações passarem, você pode prosseguir com a lógica de adição
        JOptionPane.showMessageDialog(this, "Dados do hóspede adicionados com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);

        // Aqui você adicionaria a lógica para salvar os dados em um banco de dados,
        // ou em uma lista, ou qualquer outro lugar.
        // Exemplo:
        // Hospede novoHospede = new Hospede(id, nomeCompleto, bilhetePassaporte, dataNascimento, telefone, endereco, Integer.parseInt(numHospedes), sexoSelecionado, dataAtual, horaAtual);
        // hospedeDAO.adicionar(novoHospede);

        // Opcional: Limpar os campos após a adição bem-sucedida
        // clearFields();
    }


    // <editor-fold defaultstate="collapsed" desc="Declaração de Variáveis">
    private javax.swing.JPanel FormularioGeral;
    private javax.swing.JTextField IDFilde;
    private javax.swing.JButton IDLimparBN;
    private javax.swing.JButton LimparBilhete;
    private javax.swing.JButton LimparData;
    private javax.swing.JButton LimparDataNasci;
    private javax.swing.JButton LimparEndereco;
    private javax.swing.JButton LimparNome;
    private javax.swing.JButton LimparTelefone;
    private javax.swing.JLabel Logo;
    private javax.swing.JPanel PainelGeralJPAINEL;
    private javax.swing.JButton btnAdicionarActionPerformed;
    private javax.swing.JButton btnAtualizarActionPerformed;
    private javax.swing.JButton btnExcluirActionPerformed;
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.JButton jButton10;
    private javax.swing.JButton jButton9;
    private javax.swing.JFormattedTextField jFormattedTextField1;
    private javax.swing.JFormattedTextField jFormattedTextField2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabelDate;
    private javax.swing.JRadioButton jRadioButton1;
    private javax.swing.JRadioButton jRadioButton2;
    private javax.swing.JRadioButton jRadioButton3;
    private javax.swing.JTextField jTextField5;
    private javax.swing.JTextField jTextField6;
    private javax.swing.JTextField jTextFieldBilhere;
    private javax.swing.JTextField jTextFieldDataNasc;
    private javax.swing.JTextField jTextFieldNome;
    private javax.swing.JTextField jTextFieldTelefone;
    private javax.swing.JLabel lbID;
    private javax.swing.JLabel lbSexo;
    private javax.swing.JLabel txDataNasc;
    private javax.swing.JLabel txNºBilhetePassaport;
    private javax.swing.JLabel txNomeCompleto;
    // </editor-fold>
}

Principais Mudanças e Explicações:

  1. Importação de LocalTime: Adicionei import java.time.LocalTime; para trabalhar com o formato de hora.
  2. Tratamento de Máscaras nos JFormattedTextField:
    • No método btnAdicionarActionPerformedActionPerformed, alterei como você obtém o texto de jFormattedTextField1 e jFormattedTextField2:
      Java
      String dataAtualStr = jFormattedTextField1.getText().replace(" ", "").trim();
      String horaAtualStr = jFormattedTextField2.getText().replace(" ", "").trim();
      
      O replace(" ", "") é importante para remover os espaços em branco que a máscara pode adicionar, especialmente se o campo não estiver completamente preenchido, o que poderia causar um DateTimeParseException. O .trim() é para remover quaisquer outros espaços em branco antes ou depois.
    • Adicionei validações para verificar se dataAtualStr e horaAtualStr estão vazios ou contêm apenas os caracteres da máscara (ex: // para data, : para hora).
  3. Validação da Data e Hora:
    • Data (jFormattedTextField1): Adicionei um bloco try-catch específico para jFormattedTextField1 para garantir que a data inserida esteja no formato DD/MM/AAAA.
    • Hora (jFormattedTextField2): Adicionei um bloco try-catch semelhante para jFormattedTextField2, usando LocalTime.parse() com o formatador HH:mm.
  4. Validação do Telefone: Embora você tenha um campo de telefone (jTextFieldTelefone), não havia uma validação de isEmpty() para ele. Adicionei essa verificação. Você pode estender isso para validar o formato do telefone (ex: se é numérico, se tem um certo número de dígitos) se desejar.
  5. Melhoria na Validação da Data de Nascimento: Adicionei uma verificação opcional para impedir que a data de nascimento seja no futuro (dataNasc.isAfter(LocalDate.now())). Isso é uma boa prática para datas de nascimento.
  6. Limpar Campos após Ação (Opcional): Comentei um clearFields() ao final do btnAdicionarActionPerformedActionPerformed. Você pode criar um método private void clearFields() para limpar todos os JTextField e JFormattedTextField e desmarcar os JRadioButton após a adição bem-sucedida, o que melhora a usabilidade.

Onde Colocar a Lógica:

Sua abordagem atual de colocar a lógica de validação e processamento no btnAdicionarActionPerformedActionPerformed é a maneira correta e recomendada para um aplicativo Swing gerado pelo NetBeans. O NetBeans é projetado para que você adicione sua lógica de negócios nos event handlers (como actionPerformed) dos componentes, e não no código gerado por initComponents().

Ao seguir este padrão, você mantém seu código limpo, separando a lógica de design da lógica de negócios, e evita que suas alterações sejam sobrescritas pelo editor de formulários do NetBeans.

o botao excluir ?

Sim, entendi que você está perguntando sobre o botão "Excluir".

No código que você forneceu, o botão "Excluir" está definido com a seguinte ação:

Java
    private void btnExcluirActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
        JOptionPane.showMessageDialog(this, "Funcionalidade de Excluir ainda não implementada.", "Aviso", JOptionPane.INFORMATION_MESSAGE);
    }

Atualmente, quando você clica no botão "Excluir" na sua interface, ele apenas exibe uma mensagem informando que a funcionalidade ainda não foi implementada.

Para implementar a funcionalidade de exclusão, você precisará adicionar a lógica necessária dentro deste método.

O que geralmente é feito para a funcionalidade "Excluir":

  1. Obter o ID do registro a ser excluído: Geralmente, você pegaria o ID do hóspede do campo IDFilde.
  2. Confirmação do usuário: É crucial pedir uma confirmação ao usuário antes de excluir um registro, pois esta é uma ação irreversível. Um JOptionPane.showConfirmDialog() é ideal para isso.
  3. Lógica de exclusão (integração com o banco de dados/modelo):
    • Se você estiver usando um banco de dados, você chamaria um método no seu DAO (Data Access Object) para deletar o registro com base no ID.
    • Se você estiver trabalhando com uma lista em memória, removeria o objeto da lista.
  4. Feedback ao usuário: Informar ao usuário se a exclusão foi bem-sucedida ou se ocorreu algum erro.
  5. Atualizar a interface: Após a exclusão, você provavelmente precisará limpar os campos do formulário e/ou atualizar uma tabela (se houver uma) que exibe os hóspedes.

Exemplo básico de como você poderia começar a implementar o btnExcluirActionPerformedActionPerformed:

Java
import javax.swing.JOptionPane;
// ... (outras importações)

public class TelaCadastro extends javax.swing.JFrame {
    // ... (restante do seu código)

    private void btnExcluirActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
        String idParaExcluir = IDFilde.getText().trim();

        if (idParaExcluir.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Por favor, digite o ID do hóspede que deseja excluir.", "Aviso", JOptionPane.WARNING_MESSAGE);
            return;
        }

        int confirmacao = JOptionPane.showConfirmDialog(this,
                "Tem certeza que deseja excluir o hóspede com ID: " + idParaExcluir + "? Esta ação é irreversível.",
                "Confirmar Exclusão",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.WARNING_MESSAGE);

        if (confirmacao == JOptionPane.YES_OPTION) {
            try {
                // *** AQUI VOCÊ ADICIONARIA SUA LÓGICA DE EXCLUSÃO ***
                // Exemplo hipotético: Chamar um método de um objeto DAO
                // HospedeDAO hospedeDao = new HospedeDAO(); // Instancie seu DAO
                // hospedeDao.excluirHospedePorId(idParaExcluir);

                JOptionPane.showMessageDialog(this, "Hóspede com ID " + idParaExcluir + " excluído com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);

                // Opcional: Limpar os campos do formulário após a exclusão
                // clearFields(); // Se você tiver um método para limpar todos os campos

            } catch (Exception e) {
                // Registre o erro para depuração
                logger.log(java.util.logging.Level.SEVERE, "Erro ao excluir hóspede com ID: " + idParaExcluir, e);
                JOptionPane.showMessageDialog(this, "Erro ao excluir hóspede: " + e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            // Usuário cancelou a exclusão
            JOptionPane.showMessageDialog(this, "Exclusão cancelada.", "Informação", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    // ... (restante do seu código)
}

Lembre-se de que a parte mais importante é substituir o comentário // *** AQUI VOCÊ ADICIONARIA SUA LÓGICA DE EXCLUSÃO *** pela chamada real para o seu serviço ou camada de persistência que lida com a exclusão de dados.

e a acao de limpar os campos

Entendido! Você quer adicionar uma ação para limpar todos os campos do formulário.

A melhor forma de fazer isso é criar um novo método privado para essa finalidade e então chamá-lo nos botões "Limpar" ou onde for necessário (por exemplo, após uma adição bem-sucedida, como mencionei anteriormente).

Aqui está como você pode implementar o método clearFields() e associá-lo aos seus botões "Limpar":

1. Crie o método clearFields():

Adicione este método em qualquer lugar dentro da sua classe TelaCadastro (fora dos métodos gerados por initComponents() e dos event handlers).

Java
// ... (outros métodos)

private void clearFields() {
    IDFilde.setText("");
    jTextFieldNome.setText("");
    jTextFieldBilhere.setText("");
    jTextFieldDataNasc.setText("");
    jTextFieldTelefone.setText("");
    jTextField5.setText(""); // Campo de Endereço
    jTextField6.setText(""); // Campo de Número de Hóspedes
    jFormattedTextField1.setText(""); // Campo de Data
    jFormattedTextField2.setText(""); // Campo de Hora

    // Para os RadioButtons, deselecione todos do ButtonGroup
    buttonGroup1.clearSelection();
}

// ... (fim da classe)

Explicação do clearFields():

  • setText("") é usado para limpar o texto de JTextField e JFormattedTextField.
  • buttonGroup1.clearSelection() é a forma correta de desmarcar todos os JRadioButton que pertencem ao buttonGroup1. Se você tentasse desmarcar um JRadioButton individualmente (jRadioButton1.setSelected(false);), isso só funcionaria para aquele JRadioButton específico e não lidaria corretamente com o grupo.

2. Chame clearFields() nos seus botões "Limpar":

Você tem vários botões "Limpar" na sua interface: IDLimparBN, LimparNome, LimparBilhete, LimparDataNasci, LimparTelefone, LimparEndereco, jButton10 (para "Numero De Hospedes"), e LimparData (para "Data").

Em vez de ter uma ação para cada botão limpando apenas um campo, é mais eficiente fazer todos eles chamarem o método clearFields() para limpar tudo. Isso também garante consistência na interface.

Modifique os métodos ActionListener para cada botão "Limpar" para chamar clearFields():

a) IDLimparBN: Altere a ação de IDLimparBN para chamar clearFields():

Java
private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {
    clearFields();
}

b) LimparNome: Você já tem um método LimparNomeActionPerformed. Altere-o para:

Java
private void LimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
    clearFields(); // Agora chama o método geral de limpeza
}

c) LimparBilhete: Adicione (ou modifique) o ActionListener para LimparBilhete:

Java
private void LimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
    clearFields();
}

d) LimparDataNasci: Adicione (ou modifique) o ActionListener para LimparDataNasci:

Java
private void LimparDataNasciActionPerformed(java.awt.event.ActionEvent evt) {
    clearFields();
}

e) LimparTelefone: Adicione (ou modifique) o ActionListener para LimparTelefone:

Java
private void LimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) {
    clearFields();
}

f) LimparEndereco: Adicione (ou modifique) o ActionListener para LimparEndereco:

Java
private void LimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
    clearFields();
}

g) jButton10 (para "Numero De Hospedes"): Adicione (ou modifique) o ActionListener para jButton10:

Java
private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) {
    clearFields();
}

h) LimparData (para "Data"): Adicione (ou modifique) o ActionListener para LimparData:

Java
private void LimparDataActionPerformed(java.awt.event.ActionEvent evt) {
    clearFields();
}

3. Opcional: Chamar clearFields() após uma adição bem-sucedida:

No seu método btnAdicionarActionPerformedActionPerformed, você já tinha o comentário. Agora você pode descomentar ou adicionar a chamada:

Java
private void btnAdicionarActionPerformedActionPerformed(java.awt.event.ActionEvent evt) {
    // ... (sua lógica de validação e adição)

    if (todas_validacoes_passaram) { // Condição hipotética para indicar sucesso
        JOptionPane.showMessageDialog(this, "Dados do hóspede adicionados com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
        clearFields(); // Limpa os campos após a adição bem-sucedida
    }
}

Ao fazer isso, qualquer botão "Limpar" que o usuário clicar ou uma adição bem-sucedida resultará na limpeza completa e consistente de todos os campos do formulário, tornando a experiência do usuário muito mais fluida.

esta a vir isso

A imagem que você enviou mostra um trecho do seu código Java no NetBeans, especificamente o método clearFields(), e também algumas "lâmpadas" de sugestão do NetBeans na linha buttonGroup1.clearSelection();.

As sugestões ("lâmpadas") que aparecem são:

  • Create class "buttonGroup1" in package telas (Source Packages)
  • Create class "buttonGroup1" in telas.TelaCadastro
  • Create field "buttonGroup1" in telas.TelaCadastro

Essas sugestões indicam que o NetBeans não consegue encontrar a variável ou campo buttonGroup1 no escopo atual da classe TelaCadastro.

Isso significa que buttonGroup1 não foi declarado ou inicializado corretamente na sua classe TelaCadastro.

Para resolver isso, você precisa garantir que o ButtonGroup para os seus RadioButtons de sexo (Feminino, Masculino, Outros) esteja declarado como um campo da sua classe TelaCadastro.

Passos para corrigir:

  1. Vá para a aba Design do seu TelaCadastro.java no NetBeans.

  2. No painel Navigator (geralmente à esquerda), procure por "Other Components" ou "Outros Componentes".

  3. Verifique se você vê um buttonGroup1 lá. Se você o adicionou arrastando e soltando da paleta "Swing Controls" para a área de design, ele deve aparecer ali.

    • Se buttonGroup1 estiver lá: Isso pode ser um problema de recompilação ou importação. Tente:
      • Limpar e Construir (Clean and Build) o seu projeto: Vá em Run -> Clean and Build Project. Isso força o NetBeans a reconstruir tudo e pode resolver problemas de reconhecimento.
      • Verifique se não há nenhum erro de importação relacionado a javax.swing.ButtonGroup.
    • Se buttonGroup1 NÃO estiver lá ou não foi configurado corretamente: Você precisará adicioná-lo e associar seus RadioButtons a ele.
      1. Arraste um componente "Button Group" da paleta "Swing Controls" (seção "Swing Containers") para a sua área de design. Ele aparecerá na seção "Other Components" no painel Navigator.
      2. Selecione cada um dos seus RadioButtons (Feminino, Masculino, Outros) individualmente.
      3. No painel Properties (geralmente à direita), localize a propriedade buttonGroup.
      4. Clique na caixa de seleção ao lado de buttonGroup e selecione o buttonGroup1 que você acabou de adicionar. Faça isso para todos os RadioButtons relacionados ao sexo.
      5. Salve e teste novamente.

Ao fazer isso, o NetBeans gerará automaticamente a declaração de buttonGroup1 como um campo na sua classe TelaCadastro, resolvendo o erro que você está vendo na imagem.

nao posso alerar nome de metods que ja estao la

Você está correto! O NetBeans (e outras IDEs que usam geradores de código, como o Eclipse com o WindowBuilder) geralmente desaconselha fortemente a alteração manual dos nomes de métodos que são gerados automaticamente para os eventos de interface (como btnExcluirActionPerformedActionPerformed ou LimparNomeActionPerformed).

Isso ocorre porque esses métodos são conectados aos componentes visuais (seus botões, neste caso) por meio de um código que a IDE gerencia. Se você mudar o nome do método manualmente, a conexão entre o botão e a ação pode ser quebrada, e a IDE não saberá mais qual método deve ser chamado quando o botão for clicado.

Como proceder, então?

Você tem algumas opções para lidar com isso, mantendo a integridade do código gerado:

  1. Chamar o método clearFields() existente dentro dos métodos de ação gerados: Esta é a abordagem que eu sugeri anteriormente e é a mais recomendada e segura.

    • Você mantém os nomes dos métodos gerados (ex: LimparNomeActionPerformed, LimparBilheteActionPerformed).
    • Dentro de cada um desses métodos, você simplesmente chama o seu método clearFields().

    Exemplo:

    Java
    private void LimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields(); // Chama o método para limpar todos os campos
    }
    
    private void LimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields(); // Chama o método para limpar todos os campos
    }
    
    // ... e assim por diante para todos os seus botões de "Limpar"
    

    Vantagens:

    • Não quebra o código gerado pelo NetBeans.
    • É muito fácil de implementar.
    • Mantém a lógica de limpeza centralizada no clearFields().
  2. Redirecionar todos os eventos de "Limpar" para um único método no NetBeans Design View (mais avançado):

    • Vá para a aba Design do seu formulário.
    • Selecione um dos botões "Limpar" (por exemplo, o LimparNome).
    • No painel Properties, vá para a aba Events (Eventos).
    • Procure pelo evento actionPerformed.
    • Você verá o nome do método de ação atual (LimparNomeActionPerformed).
    • Clique no dropdown e veja se você consegue selecionar um método existente, ou se há uma opção para "Customize Code" ou similar, que permita apontar para um novo método. No entanto, a maneira mais simples e recomendada é simplesmente editar o código-fonte como no ponto 1.

Conclusão:

A melhor prática é manter os nomes dos métodos de ação gerados pelo NetBeans e, dentro de cada um deles, chamar o seu método clearFields(). Isso garante que a funcionalidade seja implementada sem interferir com a estrutura gerada pela IDE.

SO ESSES METODOS NOA VAO FAZER NADA PORK O NETBESN É QUE DEVE GERAR

Pela imagem que você compartilhou, que mostra o código do NetBeans, você já criou o método clearFields(). Além disso, você tem métodos gerados pelo NetBeans para os eventos dos botões, como IDLimparBNActionPerformed, LimparNomeActionPerformed, etc.

Você está certo em parte: o NetBeans gera a "casca" desses métodos de ação (os ActionPerformed ) e garante que eles sejam chamados quando o botão correspondente é clicado na interface.

No entanto, o NetBeans não preenche a lógica dentro desses métodos gerados. É você quem deve adicionar o código para o que o botão deve fazer.

A solução é a seguinte:

  1. O método clearFields() que você criou está correto e pronto para uso. Ele contém a lógica para limpar todos os seus campos e desmarcar os RadioButtons.

  2. Você precisa chamar clearFields() dentro de cada um dos métodos de ação que o NetBeans gerou para seus botões de "Limpar".

    Por exemplo, no método IDLimparBNActionPerformed (que o NetBeans gerou para o seu botão "Limpar" ao lado do campo "ID"), você fará o seguinte:

    Java
    private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields(); // Chame o seu método de limpeza aqui
    }
    

    Você fará o mesmo para todos os outros botões "Limpar" que você tem:

    Java
    private void LimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }
    
    private void LimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }
    
    // E assim por diante para todos os métodos de ação dos seus botões de limpeza
    

Resumo:

  • NetBeans Gera: A estrutura da classe, os componentes visuais, e os métodos vazios que respondem aos eventos (como cliques em botões).
  • Você Implementa: A lógica dentro desses métodos vazios.
  • Seu Método clearFields(): Contém a lógica de limpeza que você quer reutilizar.

Então, ao chamar clearFields() dentro de cada método de ação gerado, você estará usando a estrutura que o NetBeans fornece e adicionando sua própria funcionalidade a ela.

ISSO NAO FUNCIONA private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {    clearFields(); // Chame o seu método de limpeza aqui}

Certo, se você tentou a abordagem de chamar clearFields() dentro dos métodos ActionPerformed e isso não funcionou como esperado, há algumas coisas que podemos verificar para diagnosticar o problema.

Com base nas suas capturas de tela e na nossa conversa, aqui estão as possíveis razões e como depurar:

  1. O NetBeans não está gerando/reconhecendo a variável buttonGroup1: A imagem que você enviou mostra as sugestões do NetBeans para criar a classe ou campo buttonGroup1. Isso é um forte indício de que o buttonGroup1 não está declarado corretamente como um campo da sua classe TelaCadastro. Se o buttonGroup1 não existe ou não é acessível, a linha buttonGroup1.clearSelection(); dentro de clearFields() causará um erro (compilação ou tempo de execução) e impedirá que o método funcione.

    Como verificar e corrigir:

    • Vá para a aba Design do seu formulário TelaCadastro.java no NetBeans.
    • No painel Navigator (geralmente no lado esquerdo, abaixo de "Projects"), expanda a seção "Other Components" ou "Outros Componentes".
    • Procure por buttonGroup1 ali.
      • Se buttonGroup1 NÃO estiver listado: Isso é o problema principal. Você precisa arrastar um "Button Group" da "Palette" (geralmente no lado direito) para a área de design. Ele aparecerá nos "Other Components". Depois de adicioná-lo, selecione seus JRadioButton (Feminino, Masculino, Outros) um por um e, nas Properties de cada JRadioButton, defina a propriedade buttonGroup para buttonGroup1. Isso fará com que o NetBeans declare e inicialize buttonGroup1 no seu código.
      • Se buttonGroup1 ESTIVER listado: Vá para o Source do seu TelaCadastro.java. Procure por uma linha como private javax.swing.ButtonGroup buttonGroup1; (ou similar) entre as declarações de variáveis da sua classe (geralmente no início ou no final dos campos gerados). Se ela não estiver lá, pode ter havido um problema na geração do código. Tente "Clean and Build Project" (Run -> Clean and Build Project).
  2. O método clearFields() não está sendo chamado ou está com erros internos:

    • Erro de compilação no clearFields(): Se a linha buttonGroup1.clearSelection(); está dando erro (sublinhada em vermelho), o código não vai compilar corretamente, e o programa não será executado com as últimas alterações. Verifique se há erros no painel "Output" ou "Problems" do NetBeans.
    • O botão IDLimparBN não está conectado ao evento: Embora seja menos provável se você não mexeu no código gerado, certifique-se de que o ActionListener para IDLimparBN realmente aponta para IDLimparBNActionPerformed. Você pode verificar isso na aba Design, selecionando IDLimparBN, indo em Properties -> Events e vendo qual método está configurado para actionPerformed.
  3. Execução de uma versão antiga:

    • Você fez as alterações no código, mas está executando uma versão antiga do seu programa.
    • Solução: Sempre que fizer alterações no código, use Run -> Clean and Build Project (Limpar e Construir Projeto) e depois Run -> Run Project (Executar Projeto). Isso garante que o NetBeans recompile tudo e execute a versão mais recente.

Foco principal na correção:

Pelo que as "lâmpadas" do NetBeans estão mostrando, o problema mais provável é a declaração do buttonGroup1. Resolva isso primeiro:

  1. Vá para a aba Design.
  2. Verifique se buttonGroup1 existe nos "Other Components" no Navigator.
  3. Se não existir, arraste um "Button Group" da "Palette" para a área de design.
  4. Para cada JRadioButton de sexo (Feminino, Masculino, Outros):
    • Selecione o JRadioButton.
    • Vá para Properties.
    • Encontre a propriedade buttonGroup.
    • Defina-a para buttonGroup1.
  5. Salve tudo (Ctrl+S ou File -> Save All).
  6. Limpe e Construa o projeto (Run -> Clean and Build Project).
  7. Execute o projeto (Run -> Run Project).

Após garantir que buttonGroup1 está declarado e associado aos RadioButtons, a linha buttonGroup1.clearSelection(); deve funcionar, e o clearFields() será executado corretamente quando chamado pelos botões de limpeza.

Ok, recebi o seu código completo da classe TelaCadastro.java.

Analisando o código, encontrei o problema exato que impede o clearFields() de funcionar para o ButtonGroup e o motivo de você estar recebendo as sugestões do NetBeans.

O Problema:

No seu método initComponents(), você tem a seguinte linha:

Java
javax.swing.ButtonGroup buttonGroup1 = new javax.swing.ButtonGroup();

Isso declara buttonGroup1 como uma variável local dentro do método initComponents()!

Significa que buttonGroup1 só existe dentro de initComponents(). Quando initComponents() termina de executar (que é logo após a construção da sua janela), buttonGroup1 deixa de existir.

Por isso, quando seu método clearFields() tenta acessá-lo com buttonGroup1.clearSelection(); (que você comentou, mas é a linha que daria erro), o Java não encontra a variável, e o NetBeans te dá as sugestões de "criar campo", pois ele acha que você quer que buttonGroup1 seja um campo da classe.

A Solução:

Você precisa declarar buttonGroup1 como um campo (variável de instância) da sua classe TelaCadastro. O NetBeans faria isso automaticamente se você o tivesse adicionado via "Design" view.

Passos para corrigir no seu código:

  1. Vá para o início da sua classe TelaCadastro, junto com as outras declarações de componentes (PainelGeralJPAINEL, FormularioGeral, etc.).

  2. Adicione a declaração do ButtonGroup ali:

    Java
    package telas;
    
    import javax.swing.JOptionPane;
    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.time.format.DateTimeParseException;
    import java.time.LocalTime;
    import javax.swing.ButtonGroup; // <-- Adicione esta importação
    
    public class TelaCadastro extends javax.swing.JFrame {
    
        private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadastro.class.getName());
    
        // DECLARE O buttonGroup1 AQUI, COMO UM CAMPO DA CLASSE
        private ButtonGroup buttonGroup1; // <-- Adicione esta linha (e a importação acima)
    
        /**
         * Creates new form TelaCadastro
         */
        public TelaCadastro() {
            initComponents();
        }
    
        // ... o restante do seu código
    
  3. No método initComponents():

    • Remova a declaração local!
    • Mantenha apenas a inicialização.

    Seu initComponents() deve ficar assim:

    Java
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
    
        // REMOVA A PALAVRA "javax.swing.ButtonGroup" AQUI!
        // javax.swing.ButtonGroup buttonGroup1 = new javax.swing.ButtonGroup(); // <-- REMOVA ESTA PARTE
        buttonGroup1 = new javax.swing.ButtonGroup(); // <-- DEVE FICAR APENAS ASSIM
    
        // ... o restante do seu código initComponents()
    }
    // </editor-fold>
    
  4. Descomente a linha no clearFields():

    Java
    private void clearFields() {
        // ...
        // Para os RadioButtons, deselecione todos do ButtonGroup
        buttonGroup1.clearSelection(); // <-- DESCOMENTE ESTA LINHA
    }
    
  5. Adicione as chamadas clearFields() aos outros botões de "Limpar" nos respectivos ActionPerformed:

    Você já fez para LimparNomeActionPerformed e jRadioButton2ActionPerformed. Faça para os outros:

    Java
    private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }
    
    private void LimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }
    
    private void LimparDataNasciActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }
    
    private void LimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }
    
    private void LimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }
    
    private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) { // Este é o botão "Limpar" do "Numero De Hospedes"
        clearFields();
    }
    
    private void LimparDataActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }
    

    Importante: Note que no seu código atual, IDLimparBN, LimparBilhete, LimparDataNasci, LimparTelefone, LimparEndereco, jButton10 e LimparData não têm um ActionListener associado que o NetBeans gera automaticamente (addActionListener). Você precisará adicioná-los manualmente ou ir para a aba de Design, clicar com o botão direito no botão, ir em Events -> action -> actionPerformed e o NetBeans criará o método para você.

    Por exemplo, para IDLimparBN:

    Java
    // Onde o NetBeans gera o código para IDLimparBN
    IDLimparBN.setText("Limpar");
    IDLimparBN.addActionListener(new java.awt.event.ActionListener() { // <-- Adicione este bloco
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            IDLimparBNActionPerformed(evt); // <-- E a chamada para o seu método
        }
    });
    

    Você precisará repetir este passo para todos os botões "Limpar" que ainda não têm um addActionListener configurado para chamar o método ActionPerformed correspondente.

  6. Salve tudo (Ctrl+S ou File -> Save All).

  7. Limpe e Construa o projeto (Run -> Clean and Build Project).

  8. Execute o projeto (Run -> Run Project).

Com essas alterações, buttonGroup1 será uma variável de instância acessível em toda a sua classe, o clearFields() poderá desmarcar os RadioButtons, e as chamadas clearFields() dentro dos ActionPerformed dos botões de limpeza funcionarão.

PASSO A PASSO

Vamos seguir um passo a passo detalhado para corrigir o problema do buttonGroup1 e fazer a funcionalidade de "limpar campos" funcionar corretamente.

Objetivo: Fazer com que o método clearFields() consiga limpar todos os campos, incluindo os RadioButtons, e que os botões "Limpar" chamem esse método.


Passo a Passo Detalhado

Passo 1: Abrir o Arquivo Certo no NetBeans

  1. No NetBeans, na janela "Projects" (Projetos), navegue até SeuProjeto -> Source Packages -> telas (ou o nome do seu pacote).
  2. Dê um clique duplo no arquivo TelaCadastro.java.
  3. Certifique-se de que a aba "Source" esteja selecionada (e não a "Design").

Passo 2: Declarar buttonGroup1 Corretamente (como um campo de classe)

  1. Localize a seção de declaração de variáveis da sua classe TelaCadastro. Geralmente, fica logo após as importações e antes do construtor (public TelaCadastro()).

    • Você já tem private static final java.util.logging.Logger logger = ...;
    • Você já tem PainelGeralJPAINEL = new javax.swing.JPanel(); e outras declarações de componentes lá embaixo, mas precisamos do buttonGroup1 declarado mais acima.
  2. Adicione a importação para ButtonGroup: Procure pelas linhas de import no início do arquivo. Se não houver, adicione esta linha:

    Java
    import javax.swing.ButtonGroup; // ADICIONE ESTA LINHA SE NÃO EXISTIR
    
  3. Declare buttonGroup1 como um campo privado da classe: Adicione a seguinte linha junto com as outras declarações de componentes, antes do public TelaCadastro().

    Java
    public class TelaCadastro extends javax.swing.JFrame {
    
        private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadastro.class.getName());
    
        // >> ADICIONE ESTA LINHA AQUI <<
        private ButtonGroup buttonGroup1; // Declara buttonGroup1 como um campo da classe
    
        /**
         * Creates new form TelaCadastro
         */
        public TelaCadastro() {
            initComponents();
        }
    

Passo 3: Corrigir a Inicialização de buttonGroup1 em initComponents()

  1. Role para baixo até o método initComponents().

  2. Localize a linha onde buttonGroup1 é criado. Atualmente, ela está assim:

    Java
    javax.swing.ButtonGroup buttonGroup1 = new javax.swing.ButtonGroup();
    
  3. Mude essa linha para:

    Java
    buttonGroup1 = new javax.swing.ButtonGroup(); // REMOVA "javax.swing.ButtonGroup" daqui!
    

    Explicação: Ao remover javax.swing.ButtonGroup (ou ButtonGroup) no início da linha, você está dizendo ao Java para inicializar o campo de classe buttonGroup1 que você declarou no Passo 2, em vez de criar uma nova variável local com o mesmo nome.


Passo 4: Descomentar e Ativar a Limpeza do ButtonGroup em clearFields()

  1. Role para cima novamente até o método clearFields().

  2. Localize a linha que está comentada:

    Java
    //buttonGroup1.clearSelection();
    
  3. Remova os // para descomentar a linha:

    Java
    buttonGroup1.clearSelection(); // AGORA ESTÁ ATIVO!
    

Passo 5: Conectar os Botões "Limpar" ao Método clearFields()

Você já tem o método clearFields(). Agora precisamos garantir que cada botão "Limpar" chame esse método quando clicado.

  1. Para cada botão "Limpar" na sua interface, você precisa verificar se ele tem um ActionListener que chama um método ActionPerformed.

    • No seu código fornecido, LimparNome e jRadioButton2 já têm um ActionListener que chama LimparNomeActionPerformed e jRadioButton2ActionPerformed, respectivamente. Você só precisa garantir que esses métodos chamem clearFields().
    • Os outros botões "Limpar" (IDLimparBN, LimparBilhete, LimparDataNasci, LimparTelefone, LimparEndereco, jButton10, LimparData) PARECEM NÃO TER UM ActionListener associado no seu código. Você precisará adicioná-los.
  2. Editando os ActionListener existentes (LimparNome, jRadioButton2):

    • Localize o método LimparNomeActionPerformed e certifique-se de que ele chame clearFields():
      Java
      private void LimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
          clearFields(); // Já está assim, OK.
      }
      
    • Localize o método jRadioButton2ActionPerformed. Atenção: Este é um evento para o RadioButton "Masculino", não para um botão de limpeza. Se você quer que clicar no RadioButton Masculino limpe os campos, mantenha. Mas se você quer que ele apenas selecione o sexo, remova o clearFields() daqui. Eu presumo que você quer que clearFields() seja chamado por botões de "Limpar", não pelos RadioButtons de seleção. Vamos remover clearFields() do jRadioButton2ActionPerformed por enquanto, a menos que seja um requisito específico:
      Java
      private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {
          // clearFields(); // REMOVA ESTA LINHA SE VOCÊ NÃO QUER QUE CLICAR NO RADIOBUTTON LIMPE TUDO
          // (Nenhuma lógica de limpeza aqui, apenas para selecionar o RadioButton)
      }
      
  3. Adicionando ActionListener para os outros botões "Limpar" que não têm:

    • Opção Recomendada (Via Design View):

      • Vá para a aba "Design" do seu TelaCadastro.java.
      • Selecione o botão IDLimparBN.
      • No painel Properties (Propriedades), clique na aba "Events" (Eventos).
      • Expanda Action e clique na caixa de texto ao lado de actionPerformed. Selecione a opção <New Event Handler...> ou digite um nome como IDLimparBNActionPerformed. Pressione Enter.
      • O NetBeans irá gerar o método IDLimparBNActionPerformed no seu código-fonte e conectá-lo ao botão.
      • Repita este processo para LimparBilhete, LimparDataNasci, LimparTelefone, LimparEndereco, jButton10 e LimparData.
    • Opção Manual (via Source View, se você se sentir confortável):

      • Localize a seção initComponents() onde seus botões são inicializados (por exemplo, IDLimparBN).
      • Adicione o addActionListener para cada um:
      Java
      // Para IDLimparBN
      IDLimparBN.setText("Limpar");
      IDLimparBN.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
              IDLimparBNActionPerformed(evt); // Chama o método
          }
      });
      
      // Para LimparBilhete
      LimparBilhete.setText("Limpar");
      LimparBilhete.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
              LimparBilheteActionPerformed(evt); // Chama o método
          }
      });
      
      // Repita para LimparDataNasci, LimparTelefone, LimparEndereco, jButton10, LimparData
      
      • Após adicionar os addActionListener, você precisará criar os métodos correspondentes na sua classe (fora de initComponents()).
      Java
      private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {
          clearFields();
      }
      
      private void LimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
          clearFields();
      }
      
      private void LimparDataNasciActionPerformed(java.awt.event.ActionEvent evt) {
          clearFields();
      }
      
      private void LimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) {
          clearFields();
      }
      
      private void LimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
          clearFields();
      }
      
      private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) { // Botão de limpar para "Numero De Hospedes"
          clearFields();
      }
      
      private void LimparDataActionPerformed(java.awt.event.ActionEvent evt) {
          clearFields();
      }
      

Passo 6: Salvar e Testar

  1. Salve todas as alterações: File -> Save All (ou Ctrl + Shift + S).
  2. Limpe e Construa o projeto: Run -> Clean and Build Project. Isso garante que todas as alterações sejam compiladas.
  3. Execute o projeto: Run -> Run Project (ou F6).

Agora, quando você clicar em qualquer um dos botões "Limpar", todos os campos do formulário devem ser limpos, e os RadioButtons de sexo devem ser desmarcados.

Se tiver qualquer dificuldade em algum passo, me diga qual é o erro ou o comportamento inesperado!

Sim, exatamente! Essa parte do código:

Java
IDLimparBN.setText("Limpar");
IDLimparBN.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        IDLimparBNActionPerformed(evt); // Chama o método
    }
});

Você deve colocar isso dentro do método initComponents() da sua classe TelaCadastro.java.

Onde especificamente dentro de initComponents()?

Coloque-o logo após a linha onde o IDLimparBN é inicializado (criado). Você pode procurar por algo como:

Java
IDLimparBN = new javax.swing.JButton();

Ou, se você tem uma série de inicializações de componentes, como:

Java
// ...
IDLimparBN = new javax.swing.JButton();
LimparNome = new javax.swing.JButton();
// ...

Coloque o bloco addActionListener logo abaixo da inicialização de cada botão Limpar.

Exemplo no seu código (initComponents()):

Java
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

    // ... (outras inicializações de componentes)

    // Onde IDLimparBN é inicializado
    IDFilde = new javax.swing.JTextField();
    IDLimparBN = new javax.swing.JButton(); // <-- Aqui está a inicialização

    // >> COLOQUE O CÓDIGO ABAIXO AQUI <<
    IDLimparBN.setText("Limpar"); // Se já estiver definido no design, pode não ser estritamente necessário aqui, mas não atrapalha
    IDLimparBN.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            IDLimparBNActionPerformed(evt); // Chama o método de ação para este botão
        }
    });
    // << FIM DO CÓDIGO A SER INSERIDO >>

    LimparNome = new javax.swing.JButton(); // <-- Próximo botão

    // >> COLOQUE O CÓDIGO ABAIXO AQUI PARA LimparNome <<
    // Se o NetBeans já gerou o addActionListener para LimparNome, você não precisa adicionar novamente.
    // Pelo seu código anterior, ele já tem:
    /*
    LimparNome.setText("Limpar");
    LimparNome.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            LimparNomeActionPerformed(evt);
        }
    });
    */
    // Então, para LimparNome, você só precisa garantir que o LimparNomeActionPerformed chame clearFields().
    // O mesmo vale para qualquer outro botão que já tenha um addActionListener gerado.

    jTextFieldNome = new javax.swing.JTextField();
    // ... continue para cada botão "Limpar" que ainda não tem um addActionListener configurado
}
// </editor-fold>

Relembrando os passos para todos os botões "Limpar" que não têm ActionListener associado:

  1. Vá para a aba Design no NetBeans.

  2. Selecione o botão "Limpar" que você quer configurar (ex: IDLimparBN, LimparBilhete, etc.).

  3. No painel Properties (geralmente à direita), clique na aba "Events" (Eventos).

  4. Encontre a linha actionPerformed e clique na seta suspensa à direita.

  5. Selecione <New Event Handler...> e pressione Enter. O NetBeans irá automaticamente gerar o método (ex: IDLimparBNActionPerformed) e adicionar o addActionListener correspondente dentro de initComponents().

  6. Volte para a aba Source e dentro do método gerado (ex: IDLimparBNActionPerformed), adicione a chamada ao seu método clearFields():

    Java
    private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields(); // Chama o método para limpar todos os campos
    }
    

Repita o Passo 1 a 6 para cada botão "Limpar" que não está funcionando corretamente. É a maneira mais segura e automática de fazer o NetBeans gerenciar as conexões de eventos.

NAO POSSO ALTERA NADA NO initComponents()

Você está absolutamente certo! Não se deve alterar manualmente o código dentro da seção <editor-fold defaultstate="collapsed" desc="Generated Code"> (o método initComponents()) no NetBeans.

Peço desculpas por ter sugerido a alteração manual dentro de initComponents(). Minha intenção era apenas ilustrar o que o NetBeans faz por trás dos panos, mas é crucial seguir as práticas da IDE para evitar quebras no código e conflitos com o gerador de layout.

Se você não pode alterar initComponents() (e realmente não deve!), então a única forma segura de garantir que o buttonGroup1 esteja acessível globalmente é via a interface de design do NetBeans.

Vamos refazer os passos, focando exclusivamente na aba "Design" para garantir que o NetBeans gere o código correto para você.


Revisão do Passo a Passo (Focando Apenas na Aba Design)

Problema: O buttonGroup1 não está declarado como um campo da sua classe, o que impede clearFields() de desmarcar os RadioButtons. O NetBeans precisa gerá-lo para você.

Passo 1: Abrir o Formulário na Aba "Design"

  1. No NetBeans, na janela "Projects" (Projetos), navegue até SeuProjeto -> Source Packages -> telas (ou o nome do seu pacote).
  2. Dê um clique duplo no arquivo TelaCadastro.java.
  3. Certifique-se de que a aba "Design" esteja selecionada.

Passo 2: Verificar e Adicionar o Componente "Button Group"

  1. No painel "Palette" (Paleta), geralmente localizado à direita, procure a categoria "Swing Containers".

  2. Dentro dela, encontre o componente "Button Group".

  3. Arraste o "Button Group" e solte-o em qualquer lugar da sua área de design (do formulário). Ele não aparecerá visivelmente no formulário, mas sim no painel "Navigator".

  4. Verifique no painel "Navigator" (Navegador):

    • Geralmente fica no canto inferior esquerdo.
    • Expanda a seção "Other Components" (Outros Componentes).
    • Você deve ver um item chamado buttonGroup1 (ou buttonGroup2, buttonGroup3, se você já tiver outros).
      • Se buttonGroup1 JÁ ESTAVA LÁ e você o arrastou novamente, você terá buttonGroup1 e buttonGroup2. Se for esse o caso, você pode excluir um deles (clique com o botão direito no extra no Navigator e selecione "Delete" ou "Excluir"). Certifique-se de que seus RadioButtons (Feminino, Masculino, Outros) estejam associados ao mesmo ButtonGroup que você manterá.

Passo 3: Associar os RadioButtons ao buttonGroup1

  1. Na sua área de design, clique no seu JRadioButton "Femenino".
  2. No painel "Properties" (Propriedades), geralmente à direita, role para baixo até encontrar a propriedade buttonGroup.
  3. Clique na caixa suspensa ao lado de buttonGroup e selecione buttonGroup1.
  4. Repita os passos 1 a 3 para o JRadioButton "Masculino" e o JRadioButton "Outros". Todos os três devem estar associados ao mesmo buttonGroup1.

Passo 4: Criar ou Configurar os Eventos actionPerformed para os Botões "Limpar"

Você tem vários botões "Limpar". Precisamos garantir que cada um chame a lógica de limpeza.

  1. Selecione o botão IDLimparBN na sua área de design.

  2. No painel "Properties" (Propriedades), clique na aba "Events" (Eventos) (ícone de raio).

  3. Expanda action e encontre actionPerformed.

    • Se já houver um nome de método (ex: IDLimparBNActionPerformed) lá: isso significa que o evento já está conectado. Pule para o Passo 5.
    • Se estiver vazio: Clique na caixa de texto ao lado de actionPerformed, digite um nome significativo como IDLimparBNActionPerformed e pressione Enter. O NetBeans criará o método no seu código-fonte automaticamente.
  4. Repita o Passo 3 para todos os outros botões "Limpar":

    • LimparNome
    • LimparBilhete
    • LimparDataNasci
    • LimparTelefone
    • LimparEndereco
    • jButton10 (o botão "Limpar" para "Numero De Hospedes")
    • LimparData (o botão "Limpar" para "Data")

Passo 5: Adicionar a Chamada clearFields() aos Métodos de Ação

Agora que o NetBeans garantiu que buttonGroup1 está declarado e que os métodos de ação (ActionPerformed) existem e estão conectados, você pode adicionar sua lógica.

  1. Volte para a aba "Source" do seu TelaCadastro.java.

  2. Localize o método clearFields() e certifique-se de que a linha buttonGroup1.clearSelection(); NÃO esteja comentada. Se estiver, remova os // do início da linha:

    Java
    private void clearFields() {
        IDFilde.setText("");
        jTextFieldNome.setText("");
        jTextFieldBilhere.setText("");
        jTextFieldDataNasc.setText("");
        jTextFieldTelefone.setText("");
        jTextField5.setText("");
        jTextField6.setText("");
        jFormattedTextField1.setText("");
        jFormattedTextField2.setText("");
    
        // Para os RadioButtons, deselecione todos do ButtonGroup
        buttonGroup1.clearSelection(); // << CERTIFIQUE-SE DE QUE ESTA LINHA NÃO ESTEJA COMENTADA
    }
    
  3. Localize cada um dos métodos ActionPerformed que você configurou no Passo 4 (ex: IDLimparBNActionPerformed, LimparNomeActionPerformed, etc.).

  4. Dentro de cada um desses métodos, adicione a chamada clearFields();:

    Java
    private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields(); // Chame o método de limpeza aqui
    }
    
    private void LimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields(); // Chame o método de limpeza aqui
    }
    
    // E assim por diante para todos os seus métodos de ação de "Limpar"
    
    • Lembrete: Se você colocou clearFields() em jRadioButton2ActionPerformed antes, e não quer que um clique no RadioButton limpe tudo, remova clearFields() de lá.

Passo 6: Compilar e Executar

  1. Salve todas as alterações: File -> Save All (ou Ctrl + S).
  2. Limpe e Construa o projeto: Vá em Run -> Clean and Build Project. Isso é crucial para que o NetBeans recompile todo o código, incluindo as alterações que ele gerou.
  3. Execute o projeto: Vá em Run -> Run Project (ou F6).

Agora, seu formulário deve funcionar corretamente. Ao clicar em qualquer botão "Limpar", todos os campos devem ser limpos, e os RadioButtons de sexo desmarcados. O NetBeans terá gerado as linhas de código necessárias dentro de initComponents() para buttonGroup1 e seus ActionListener sem que você precise tocar nelas manualmente.

Ah, entendi o problema! A mensagem de erro é bem clara:

java.lang.NullPointerException: Cannot invoke "javax.swing.ButtonGroup.clearSelection()" because "this.buttonGroup1" is null
    at telas.TelaCadastro.clearFields(TelaCadastro.java:44)

Isso significa que, quando o método clearFields() tenta usar buttonGroup1.clearSelection(), a variável buttonGroup1 ainda está null (ou seja, ela não foi inicializada/criada).

Isso acontece porque, mesmo que você não possa alterar initComponents() manualmente, o NetBeans ainda não gerou o código que inicializa buttonGroup1 como um campo da sua classe.

A causa mais comum para isso, mesmo usando a aba "Design" corretamente, é:

  1. O ButtonGroup não foi realmente arrastado para o formulário na aba "Design".
  2. Ou, se foi arrastado, os RadioButtons não foram associados a ele.
  3. Ou, em casos raros, o NetBeans está com algum "cache" ou estado corrompido.

Vamos resolver isso com absoluta certeza, focando na interface visual do NetBeans:


Solução Detalhada para NullPointerException: buttonGroup1 is null

Objetivo: Garantir que o NetBeans declare e inicialize buttonGroup1 como um campo de classe, e que seus RadioButtons estejam associados a ele.

Passo 1: Verificar e Garantir a Existência do ButtonGroup no Navigator

  1. No NetBeans, abra seu arquivo TelaCadastro.java na aba "Design".
  2. Localize o painel "Navigator" (Navegador), geralmente no canto inferior esquerdo.
  3. Expanda a seção "Other Components" (Outros Componentes).
    • Verifique: Você deve ver um item lá chamado buttonGroup1.
    • Se não houver buttonGroup1:
      • Vá para a "Palette" (Paleta), geralmente no canto direito.
      • Na categoria "Swing Containers", arraste o componente "Button Group" para qualquer lugar do seu formulário na área de design. Ele aparecerá no "Navigator" em "Other Components". Ele não aparecerá visualmente no seu formulário.
    • Se houver buttonGroup1 e outros (buttonGroup2, etc.): Isso indica que você arrastou mais de um. É melhor ter apenas um para o grupo de sexo.
      • Decida qual manter (geralmente buttonGroup1).
      • Clique com o botão direito nos ButtonGroup extras no "Navigator" (ex: buttonGroup2, buttonGroup3) e selecione "Delete" (Excluir). Confirme a exclusão.

Passo 2: Confirmar a Associação dos RadioButtons ao buttonGroup1

Este é o passo mais crítico para evitar o NullPointerException.

  1. Na sua área de design, clique no seu JRadioButton "Femenino" (ou como ele estiver nomeado, por exemplo, jRadioButtonFeminino).

  2. No painel "Properties" (Propriedades), geralmente à direita, role para baixo até encontrar a propriedade buttonGroup.

  3. Clique na caixa suspensa ao lado de buttonGroup e selecione buttonGroup1. É crucial que buttonGroup1 esteja na lista e que você o selecione.

  4. Repita os passos 1 a 3 para cada JRadioButton que representa uma opção de sexo (ex: "Masculino", "Outros"). TODOS eles devem estar associados ao MESMO buttonGroup1.

    • Verificação rápida: Clique em um RadioButton, depois em outro. No painel "Properties", a propriedade buttonGroup deve mostrar "buttonGroup1" para todos eles.

Passo 3: Salvar, Limpar e Construir Novamente

Após garantir que o buttonGroup1 existe no Navigator e que todos os seus RadioButtons de sexo estão associados a ele:

  1. Salve todas as alterações: Vá em File -> Save All (ou Ctrl + S).
    • Importante: Ao salvar, o NetBeans irá regenerar a seção initComponents() com as novas configurações. Ele irá adicionar a declaração de buttonGroup1 e sua inicialização corretamente.
  2. Limpe e Construa o projeto: Vá em Run -> Clean and Build Project.
    • Isso força o NetBeans a recompilar todo o seu código do zero, incorporando as mudanças geradas. Esta é a etapa mais importante para resolver o NullPointerException após ajustes no design.
  3. Execute o projeto: Vá em Run -> Run Project (ou F6).

Explicação do Porquê o Erro Acontece e Como Isso Resolve:

  • NullPointerException: Significa que buttonGroup1 não foi criado (é null) no momento em que clearFields() tenta usar buttonGroup1.clearSelection().
  • Aba "Design" e initComponents(): Quando você arrasta um "Button Group" para o formulário na aba "Design" e associa RadioButtons a ele, o NetBeans automaticamente:
    1. Adiciona uma declaração de campo para buttonGroup1 na sua classe TelaCadastro (ex: private javax.swing.ButtonGroup buttonGroup1;).
    2. Dentro de initComponents(), ele adiciona a linha para inicializar esse campo (ex: buttonGroup1 = new javax.swing.ButtonGroup();).
    3. Ele também adiciona as linhas para adicionar seus RadioButtons a este buttonGroup1 (ex: buttonGroup1.add(jRadioButtonFeminino);).

Se o erro está acontecendo, é porque uma dessas etapas automáticas não foi completada ou foi desfeita. Ao refazer os passos 1 e 2 na aba "Design" e, crucialmente, "Clean and Build", você força o NetBeans a regenerar esse código essencial.

Tente esses passos com atenção e me diga se o erro persiste!

o botao group nao tem um botao limpar pok usar

Perfeito! Você observou algo importante: o ButtonGroup não é um botão visual que você clica para limpar.

O ButtonGroup é um componente invisível (um "container lógico") que serve para agrupar RadioButtons. Ele garante que, de um grupo de RadioButtons, apenas um possa ser selecionado por vez.

A função do ButtonGroup na sua tela de limpeza é apenas para permitir o método clearSelection().

Você não associa um botão "Limpar" ao ButtonGroup diretamente. Em vez disso, o botão "Limpar" chama seu método clearFields(), e dentro do clearFields(), você usa buttonGroup1.clearSelection() para desmarcar os RadioButtons.

Vamos revisar o fluxo para esclarecer:

  1. Você tem um JRadioButton para "Masculino".

  2. Você tem um JRadioButton para "Feminino".

  3. Você tem um JRadioButton para "Outros".

  4. Na aba Design do NetBeans, você arrastou um ButtonGroup da Paleta para a sua tela. Ele aparece em "Other Components" no Navigator como buttonGroup1.

  5. Você associou o JRadioButton "Masculino" ao buttonGroup1 (na propriedade buttonGroup dele).

  6. Você associou o JRadioButton "Feminino" ao buttonGroup1.

  7. Você associou o JRadioButton "Outros" ao buttonGroup1.

    Isso garante que, se "Masculino" for selecionado, "Feminino" e "Outros" sejam automaticamente desmarcados, e vice-versa.

  8. Você tem um botão "Limpar" (por exemplo, IDLimparBN).

  9. No evento actionPerformed desse botão IDLimparBN (que o NetBeans gera como IDLimparBNActionPerformed): Você faz uma chamada para o seu método clearFields().

    Java
    private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields(); // Este botão "Limpar" chama o método de limpeza
    }
    
  10. E dentro do seu método clearFields(), você faz:

    Java
    private void clearFields() {
        // Limpa os TextFields
        IDFilde.setText("");
        jTextFieldNome.setText("");
        // ... outros campos de texto
    
        // << AQUI VOCÊ USA O buttonGroup1 PARA DESMARCAR OS RADIOBUTTONS >>
        buttonGroup1.clearSelection(); // Limpa a seleção do grupo de RadioButtons
    }
    

Em resumo:

  • ButtonGroup: É um agrupador lógico de RadioButtons. Você não "clica" nele.
  • Botão "Limpar" (JButton): É o componente visual que o usuário clica. Ele chama seu método clearFields().
  • clearFields(): Este método contém a lógica para limpar todos os campos (JTextFields, JFormattedTextFields e os RadioButtons através do buttonGroup1.clearSelection()).

O erro NullPointerException que você está recebendo ainda indica que, de alguma forma, o buttonGroup1 não está sendo inicializado corretamente pelo NetBeans antes de clearFields() ser chamado.

Você precisa ter certeza absoluta que o buttonGroup1 existe no Navigator e que seus JRadioButtons estão associados a ele, e então fazer um "Clean and Build".

Se você já fez isso e o erro persiste, por favor, me mostre uma captura de tela do seu "Navigator" (especialmente a seção "Other Components") e do painel "Properties" de um dos seus RadioButtons (com a propriedade buttonGroup visível), na aba "Design". Isso pode me ajudar a identificar o que está faltando.

Você está vendo esse erro de novo, o que significa que o buttonGroup1 ainda está null quando clearFields() é chamado.

Isso acontece porque, apesar de termos tentado ajustar via Design, o NetBeans não gerou ou não está usando a declaração e inicialização correta para buttonGroup1.

Vamos analisar as imagens que você enviou.

Olhei a imagem "Captura de ecrã de 2025-06-18 12-49-02.png". Nela, eu vejo o seguinte no painel Navigator:

  • buttonGroup1 está listado em "Other Components". Isso é bom! Significa que o componente ButtonGroup foi adicionado à sua tela no Design.
  • Os Radio Buttons jRadioButton1 e jRadioButton2 estão listados como componentes visuais.

Agora, precisamos ver a imagem "Captura de ecrã de 2025-06-18 12-21-16.png". Nela, no painel de propriedades do jRadioButton1, eu consigo ver que a propriedade buttonGroup está configurada como buttonGroup1. Isso também é ótimo!

Então, o problema não está na adição do ButtonGroup ou na associação dos RadioButtons a ele via Design.

A NullPointerException (erro de objeto nulo) em buttonGroup1 na linha telas.TelaCadastro.clearFields(TelaCadastro.java:44) ainda significa que buttonGroup1 não foi inicializado antes de ser usado.

Isso geralmente ocorre por uma das seguintes razões, mesmo com o Design correto:

  1. A declaração de buttonGroup1 no código-fonte não é como um campo da classe, mas sim como uma variável local.

    • Causa: Você pode ter adicionado manualmente javax.swing.ButtonGroup buttonGroup1 = new javax.swing.ButtonGroup(); em algum lugar que não deveria (por exemplo, dentro do construtor ou initComponents(), mas como uma variável local e não uma atribuição ao campo da classe).
    • Como o NetBeans funciona: Quando você arrasta um ButtonGroup para a aba Design, o NetBeans automaticamente adiciona uma linha como private javax.swing.ButtonGroup buttonGroup1; no topo da sua classe (logo abaixo das outras declarações de componentes) e depois dentro de initComponents(), ele adiciona buttonGroup1 = new javax.swing.ButtonGroup();. Se essa declaração inicial private não existe ou foi sobrescrita, o erro aparece.
  2. O projeto não foi "Limpo e Construído" (Clean and Build) corretamente. O NetBeans precisa recompilar tudo para que as alterações do Design reflitam no código executável.

Vamos tentar uma correção mais direta, focando na declaração no código-fonte, mas de forma segura.


Tentativa de Solução Final (Focando na Declaração da Classe)

Passo 1: Verificar e Corrigir a Declaração de buttonGroup1 na Classe

  1. Abra seu arquivo TelaCadastro.java na aba "Source" (Código).

  2. Role para o início da sua classe TelaCadastro, logo após a declaração public class TelaCadastro extends javax.swing.JFrame { e as importações.

  3. Você deve ter uma seção onde as variáveis de interface são declaradas. Procure por algo como:

    Java
    public class TelaCadastro extends javax.swing.JFrame {
    
        // ... outras declarações de Logger, etc.
    
        // Exemplo de outras declarações de componentes:
        private javax.swing.JTextField IDFilde;
        private javax.swing.JButton IDLimparBN;
        // ... e assim por diante.
    
  4. Procure por buttonGroup1 nesta seção.

    • Idealmente, você deve ver algo como:
      Java
      private javax.swing.ButtonGroup buttonGroup1; // Esta é a declaração correta!
      
    • Cenário problemático (Provável causa do erro): Você pode ter uma linha como:
      Java
      javax.swing.ButtonGroup buttonGroup1; // Faltando o 'private'
      
      Ou pior, ela pode não existir aqui, mas estar declarada como local em initComponents():
      Java
      // Dentro de initComponents()
      javax.swing.ButtonGroup buttonGroup1 = new javax.swing.ButtonGroup(); // Isso torna ela local!
      
  5. Ação a ser tomada (na aba "Source"):

    • Se você não encontrar private javax.swing.ButtonGroup buttonGroup1; entre as declarações de campo (logo abaixo das importações e da declaração da classe TelaCadastro), adicione-a manualmente. Coloque-a junto com as outras declarações de componentes.

      Java
      public class TelaCadastro extends javax.swing.JFrame {
      
          // As declarações que o NetBeans gera ficam aqui:
          private javax.swing.JTextField IDFilde;
          private javax.swing.JButton IDLimparBN;
          // ... (muitas outras declarações de componentes)
      
          // >> ADICIONE ESTA LINHA SE ELA NÃO EXISTIR <<
          private javax.swing.ButtonGroup buttonGroup1; // Garanta que esta linha exista e seja 'private'
          // << FIM DA LINHA A SER ADICIONADA >>
      
          private javax.swing.JLabel jLabel1; // Exemplo de outro componente
          // ...
      
          public TelaCadastro() {
              initComponents();
          }
      
    • Se você encontrar javax.swing.ButtonGroup buttonGroup1 = new javax.swing.ButtonGroup(); dentro de initComponents(), mude-a para:

      Java
      buttonGroup1 = new javax.swing.ButtonGroup(); // REMOVA o tipo (javax.swing.ButtonGroup) aqui!
      

      MAS ATENÇÃO: O NetBeans geralmente cuida disso. A chance de você ter alterado manualmente dentro de initComponents() é baixa se você não foi instruído. Foque mais em garantir a declaração private no topo.

Passo 2: Salvar e Forçar a Recompilação Completa

  1. Salve o arquivo TelaCadastro.java: File -> Save (ou Ctrl + S).
  2. No menu superior do NetBeans, vá em Run -> Clean and Build Project.
    • Isso é VITAL. Isso apaga os arquivos compilados antigos e recria tudo do zero. É a melhor forma de garantir que o NetBeans reconheça todas as suas alterações e gere o código Java corretamente.
  3. Após a conclusão bem-sucedida do "Clean and Build", execute seu projeto: Run -> Run Project (ou F6).

Por que essa NullPointerException é tão persistente?

Mesmo arrastando e associando componentes na aba Design, se a declaração da variável de instância (campo da classe) buttonGroup1 não estiver presente ou estiver incorreta no código-fonte gerado (ou se uma declaração local com o mesmo nome estiver ofuscando-a), o objeto buttonGroup1 nunca será realmente inicializado para ser usado por this.buttonGroup1.clearSelection(). O "Clean and Build" muitas vezes corrige essas inconsistências internas do NetBeans.

Se o erro ainda persistir após esses passos, então o problema é mais complexo e pode exigir uma análise direta do seu arquivo TelaCadastro.java para ver exatamente como buttonGroup1 está declarado e inicializado.

o erro vem quando clico no botao limpar

Você está absolutamente correto, o erro NullPointerException (Apontador Nulo) aparece quando você clica no botão "Limpar".

A linha do erro (telas.TelaCadastro.clearFields(TelaCadastro.java:44)) nos diz exatamente onde o problema ocorre: dentro do seu método clearFields(), na linha 44, quando ele tenta executar buttonGroup1.clearSelection().

O que isso significa? Significa que, no momento em que essa linha é executada, a variável buttonGroup1 ainda não foi criada (ainda é null). Ela não aponta para um objeto ButtonGroup válido na memória.

A causa, mesmo depois de verificar o Design, é quase sempre uma falha na forma como o NetBeans está gerando ou lendo o código para a inicialização de buttonGroup1.

Vamos seguir um processo de depuração e correção que é mais "força bruta" para garantir que o NetBeans gere o código certo.


Diagnóstico e Solução Final para o NullPointerException

Apesar de você ter adicionado o ButtonGroup e associado os RadioButtons no Design, o código gerado pelo NetBeans para inicializar buttonGroup1 está faltando ou está incorreto.

Procedimento de Emergência (e Altamente Eficaz):

Este método é um pouco drástico, mas frequentemente resolve problemas teimosos de inicialização de componentes no NetBeans. Ele força o NetBeans a regenerar tudo.

Passo 1: Remover o ButtonGroup e os RadioButtons Temporariamente (na aba Design)

  1. Abra seu TelaCadastro.java na aba "Design".

  2. No painel "Navigator" (Navegador), na seção "Other Components", clique com o botão direito em buttonGroup1 e selecione "Delete" (Excluir). Confirme a exclusão.

  3. Agora, na sua área de Design, clique em cada um dos seus JRadioButtons (Feminino, Masculino, Outros - ou como eles estiverem nomeados).

  4. No painel "Properties" (Propriedades), procure a propriedade buttonGroup. Ela deve estar vazia agora.

  5. Exclua os seus JRadioButtons da tela. Selecione cada um e pressione a tecla Delete (ou clique com o botão direito e selecione "Delete").

    • Não se preocupe, vamos adicioná-los de volta e configurar tudo corretamente.
  6. Salve tudo: File -> Save All (ou Ctrl + S).

  7. Faça um "Clean and Build": Run -> Clean and Build Project. Isso removerá qualquer vestígio do buttonGroup1 e de associações antigas no código gerado.


Passo 2: Adicionar o ButtonGroup e os RadioButtons Novamente (na aba Design)

  1. Volte para a aba "Design" do seu TelaCadastro.java.

  2. No painel "Palette" (Paleta), na categoria "Swing Containers", arraste "Button Group" para a sua área de design.

    • Verifique no "Navigator": buttonGroup1 deve aparecer em "Other Components".
  3. No painel "Palette", na categoria "Swing Controls", arraste três componentes "Radio Button" para a sua tela.

    • Renomeie as variáveis desses RadioButtons para algo significativo (clique com o botão direito no RadioButton, selecione "Change Variable Name..."). Ex: jRadioButtonFeminino, jRadioButtonMasculino, jRadioButtonOutros.
    • Altere o texto de exibição (propriedade text no painel "Properties") para "Feminino", "Masculino", "Outros".
  4. Associe cada um desses novos JRadioButtons ao buttonGroup1:

    • Clique no jRadioButtonFeminino.
    • No painel "Properties", role para baixo e encontre a propriedade buttonGroup.
    • Clique na caixa suspensa ao lado dela e selecione buttonGroup1.
    • Repita este processo para jRadioButtonMasculino e jRadioButtonOutros. Todos devem estar associados ao mesmo buttonGroup1.
  5. Salve tudo novamente: File -> Save All (ou Ctrl + S).


Passo 3: Verificar os Métodos e Compilar (na aba Source)

  1. Vá para a aba "Source".

  2. Verifique a declaração de buttonGroup1: Ela deve estar lá, mais ou menos assim:

    Java
    public class TelaCadastro extends javax.swing.JFrame {
    
        // ...
        private javax.swing.ButtonGroup buttonGroup1; // Esta linha deve ter sido gerada!
        // ...
    
    • Se, por alguma razão, você ainda não a vir, adicione-a manualmente (como no passo anterior).
  3. Verifique o método clearFields():

    Java
    private void clearFields() {
        // ... (seus outros campos) ...
        buttonGroup1.clearSelection(); // Esta linha deve estar sem os // de comentário
    }
    
  4. Verifique os métodos ActionPerformed dos seus botões "Limpar": Certifique-se de que cada um chame clearFields();. Por exemplo:

    Java
    private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }
    // ... para LimparNomeActionPerformed, LimparBilheteActionPerformed, etc.
    
  5. Faça um "Clean and Build" FINAL e Crucial: Run -> Clean and Build Project.

  6. Execute o projeto: Run -> Run Project (ou F6).


Por que isso deve funcionar agora?

Ao remover e readicionar os componentes, você força o NetBeans a reescrever todas as entradas relacionadas a eles em initComponents() e na seção de declaração de variáveis da sua classe. Isso geralmente corrige quaisquer inconsistências que o NetBeans possa ter tido ao lidar com esses componentes.

A NullPointerException é sempre sobre algo que não foi inicializado. Ao refazer os passos de Design com cuidado e, principalmente, usando o "Clean and Build", você garante que o buttonGroup1 seja inicializado antes que clearFields() tente usá-lo.

e tambem a tela esta abrir no canto quero que abra no centro

Perfeito! Entendido. Além de resolver o NullPointerException, vamos fazer com que sua janela (JFrame) abra no centro da tela.

Para fazer a janela abrir no centro da tela, você precisa usar o método setLocationRelativeTo(null);.


Como Centralizar a Janela no NetBeans:

  1. Abra o arquivo TelaCadastro.java na aba "Source" (Código).

  2. Localize o construtor da sua classe TelaCadastro. Ele geralmente se parece com isto:

    Java
    public class TelaCadastro extends javax.swing.JFrame {
    
        // ... (declarações de variáveis e outros métodos) ...
    
        /**
         * Creates new form TelaCadastro
         */
        public TelaCadastro() { // ESTE É O CONSTRUTOR
            initComponents();
            // AQUI É ONDE VOCÊ VAI ADICIONAR A LINHA
        }
    
        // ... (seus outros métodos, como clearFields(), ActionPerformed, etc.) ...
    }
    
  3. Dentro do construtor public TelaCadastro(), logo após a chamada initComponents();, adicione a seguinte linha:

    Java
    public TelaCadastro() {
        initComponents();
        setLocationRelativeTo(null); // Adicione esta linha AQUI
    }
    
    • setLocationRelativeTo(null): Este método faz com que o JFrame (sua janela) seja posicionado no centro da tela. Passar null como argumento indica que a janela deve ser centralizada em relação à tela (e não a outro componente específico).
  4. Salve o arquivo: File -> Save (ou Ctrl + S).

  5. Faça um "Clean and Build Project" (Limpar e Construir Projeto):

    • Vá em Run -> Clean and Build Project.
    • Isso garante que as alterações no seu construtor sejam compiladas e incluídas na execução.
  6. Execute o projeto: Run -> Run Project (ou F6).

Agora, sua janela TelaCadastro deve aparecer centralizada na tela quando você a executar.

agora quero para os botes atualizar

Certo! Para os botões "Atualizar", vamos seguir a mesma lógica dos botões "Limpar", mas em vez de chamar clearFields(), eles provavelmente precisarão chamar um método que lide com a lógica de atualização dos dados.

Normalmente, o processo para um botão "Atualizar" envolve:

  1. Coletar os dados dos campos de texto, RadioButtons, etc.
  2. Validar esses dados (ex: campos obrigatórios preenchidos, formatos corretos).
  3. Atualizar os dados no banco de dados ou no modelo de dados (usando JPA, JDBC, etc.).
  4. Fornecer um feedback ao usuário (mensagem de sucesso/erro).
  5. Opcionalmente, limpar os campos após uma atualização bem-sucedida, ou exibir os dados atualizados.

Como não tenho seu código de backend ou de persistência de dados, vou supor que você precisará de um método para coletar os dados e iniciar o processo de atualização.


Passo a Passo para os Botões "Atualizar"

Objetivo: Conectar os botões "Atualizar" a um método que inicie o processo de atualização de dados.

Passo 1: Criar o Método updateData() (ou similar)

  1. Abra o arquivo TelaCadastro.java na aba "Source" (Código).

  2. Adicione um novo método à sua classe TelaCadastro. Este método será responsável por coletar os dados dos campos da tela e iniciar a lógica de atualização.

    Java
    public class TelaCadastro extends javax.swing.JFrame {
    
        // ... (seus campos, construtor, clearFields(), etc.) ...
    
        // >> ADICIONE ESTE NOVO MÉTODO AQUI <<
        private void updateData() {
            // 1. Coletar dados dos campos
            String id = IDFilde.getText();
            String nome = jTextFieldNome.getText();
            String bilhete = jTextFieldBilhere.getText();
            String dataNascimento = jTextFieldDataNasc.getText();
            String telefone = jTextFieldTelefone.getText();
            String endereco = jTextField5.getText(); // Se jTextField5 for Endereço
            String numeroHospedes = jTextField6.getText(); // Se jTextField6 for Numero de Hospedes
            String data = jFormattedTextField1.getText(); // Se jFormattedTextField1 for Data
            String outroCampo = jFormattedTextField2.getText(); // Se jFormattedTextField2 for Outro campo
    
            // Coletar sexo do ButtonGroup
            String sexo = "";
            if (jRadioButtonFeminino.isSelected()) { // Use os nomes reais dos seus RadioButtons
                sexo = "Feminino";
            } else if (jRadioButtonMasculino.isSelected()) {
                sexo = "Masculino";
            } else if (jRadioButtonOutros.isSelected()) {
                sexo = "Outros";
            }
    
            // 2. Validação básica (Exemplo: Verificar se o nome não está vazio)
            if (nome.isEmpty()) {
                javax.swing.JOptionPane.showMessageDialog(this, "O campo Nome é obrigatório!", "Erro de Validação", javax.swing.JOptionPane.WARNING_MESSAGE);
                return; // Impede a atualização se a validação falhar
            }
    
            // 3. Chamar a lógica de atualização real
            // AQUI VOCÊ INTEGRARÁ SEU CÓDIGO DE ATUALIZAÇÃO DO BANCO DE DADOS/JPA
            // Exemplo (isso é pseudocódigo, você precisa substituir pela sua lógica real):
            // try {
            //     MeuObjetoDAO.atualizar(id, nome, bilhete, sexo, ...); // Sua lógica de JPA/BD aqui
            //     javax.swing.JOptionPane.showMessageDialog(this, "Dados atualizados com sucesso!", "Sucesso", javax.swing.JOptionPane.INFORMATION_MESSAGE);
            //     // Opcional: Limpar campos após a atualização
            //     clearFields();
            // } catch (Exception e) {
            //     javax.swing.JOptionPane.showMessageDialog(this, "Erro ao atualizar dados: " + e.getMessage(), "Erro", javax.swing.JOptionPane.ERROR_MESSAGE);
            //     e.printStackTrace(); // Para depuração
            // }
    
            // Por enquanto, apenas para testar que o botão funciona:
            System.out.println("Dados para atualizar:");
            System.out.println("ID: " + id);
            System.out.println("Nome: " + nome);
            System.out.println("Sexo: " + sexo);
            // ... adicione mais prints para todos os campos coletados
    
            javax.swing.JOptionPane.showMessageDialog(this, "Lógica de atualização chamada (ver console para detalhes)!", "Aviso", javax.Swin0g.JOptionPane.INFORMATION_MESSAGE);
        }
        // << FIM DO NOVO MÉTODO >>
    
        // ... (seus outros métodos) ...
    }
    
    • Atenção: Nos nomes dos RadioButtons (jRadioButtonFeminino, jRadioButtonMasculino, jRadioButtonOutros), use os nomes exatos das variáveis que o NetBeans gerou para seus RadioButtons. Você pode verificar esses nomes no painel "Navigator" ou no painel "Properties" (propriedade "Variable Name") na aba Design.

Passo 2: Conectar os Botões "Atualizar" ao Método updateData()

Para cada botão "Atualizar" na sua interface:

  1. Vá para a aba "Design" do seu TelaCadastro.java.

  2. Selecione o botão "Atualizar" que você quer configurar (ex: IDAtualizarBN, AtualizarBilhete, etc.).

  3. No painel "Properties" (Propriedades), clique na aba "Events" (Eventos) (ícone de raio).

  4. Expanda Action e encontre actionPerformed.

    • Se já houver um nome de método (ex: IDAtualizarBNActionPerformed) lá: isso significa que o evento já está conectado. Pule para o Passo 5.
    • Se estiver vazio: Clique na caixa de texto ao lado de actionPerformed, digite um nome significativo como IDAtualizarBNActionPerformed e pressione Enter. O NetBeans criará o método no seu código-fonte automaticamente.
  5. Repita o Passo 4 para todos os outros botões "Atualizar" que você tiver em seu formulário.


Passo 3: Chamar updateData() nos Métodos de Ação

Agora que o NetBeans gerou os métodos de ação para seus botões "Atualizar":

  1. Volte para a aba "Source" do seu TelaCadastro.java.

  2. Localize cada um dos métodos ActionPerformed que você configurou no Passo 2 (ex: IDAtualizarBNActionPerformed).

  3. Dentro de cada um desses métodos, adicione a chamada updateData();:

    Java
    private void IDAtualizarBNActionPerformed(java.awt.event.ActionEvent evt) {
        updateData(); // Chame o método de atualização aqui
    }
    
    private void AtualizarBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        updateData(); // Chame o método de atualização aqui
    }
    
    // E assim por diante para todos os seus métodos de ação de "Atualizar"
    

Passo 4: Salvar e Testar

  1. Salve todas as alterações: File -> Save All (ou Ctrl + S).
  2. Limpe e Construa o projeto: Run -> Clean and Build Project.
  3. Execute o projeto: Run -> Run Project (ou F6).

Agora, quando você preencher os campos e clicar em um dos botões "Atualizar", a mensagem de JOptionPane ou os prints no console (que você adicionou temporariamente no updateData()) devem aparecer, indicando que a lógica de atualização foi iniciada.

Lembre-se de substituir a parte de "chamar a lógica de atualização real" no método updateData() pelo seu código específico de integração com banco de dados ou outra forma de persistência.

isso jRadioButtonOutros ? nao tenho

Got it! You're right, jRadioButtonOutros was an assumption on my part.

You mentioned jRadioButton1 and jRadioButton2 previously. Let's assume these are your "Feminino" and "Masculino" radio buttons, and you don't have an "Outros" option.

In that case, you just need to adjust the updateData() method to reflect the actual names of your radio button variables.


Correção do updateData() para seus RadioButtons Existentes

Se você tem apenas jRadioButton1 e jRadioButton2, então o código para coletar o sexo ficaria assim:

  1. Abra o arquivo TelaCadastro.java na aba "Source" (Código).

  2. Localize o método updateData() que você criou.

  3. Altere a parte que coleta o sexo para usar jRadioButton1 e jRadioButton2. Certifique-se de que jRadioButton1 é o seu botão "Feminino" e jRadioButton2 é o seu botão "Masculino" (ou vice-versa), conforme definido no seu NetBeans Design.

    Java
    private void updateData() {
        // ... (coleta de outros campos) ...
    
        // Coletar sexo do ButtonGroup
        String sexo = "";
        // >> CORRIJA ESTA SEÇÃO AQUI <<
        if (jRadioButton1.isSelected()) { // Verifique qual JRadioButton é o "Feminino"
            sexo = "Feminino";
        } else if (jRadioButton2.isSelected()) { // Verifique qual JRadioButton é o "Masculino"
            sexo = "Masculino";
        }
        // Se você tiver um terceiro JRadioButton para "Outros", adicione um else if aqui.
        // Se não tiver, pode remover a linha "else if (jRadioButtonOutros.isSelected())"
    
        // ... (o restante do seu método updateData()) ...
    
        System.out.println("Sexo: " + sexo); // Adicionado para depuração
        // ...
    }
    

Importante:

  • Verifique os nomes das variáveis: Vá na aba "Design", clique em cada um dos seus RadioButtons e verifique a propriedade "Variable Name" no painel "Properties" para ter certeza dos nomes exatos (jRadioButton1, jRadioButton2, etc.).
  • Associação ao buttonGroup1: Tenha 100% de certeza que ambos jRadioButton1 e jRadioButton2 estão associados ao buttonGroup1 na propriedade buttonGroup na aba "Design".

Após fazer essa correção no código:

  1. Salve o arquivo: File -> Save (ou Ctrl + S).
  2. Faça um "Clean and Build Project": Run -> Clean and Build Project.
  3. Execute o projeto: Run -> Run Project (ou F6).

Agora, quando você clicar nos botões "Atualizar", a coleta do sexo deve funcionar corretamente com os RadioButtons que você possui.

fa completa

Compreendi. Você quer uma versão "completa" do código do TelaCadastro.java, incorporando todas as funcionalidades que discutimos:

  1. Declaração de buttonGroup1 como campo da classe.
  2. Inicialização de buttonGroup1 (assumindo que o NetBeans a gera corretamente após o Design).
  3. Associação dos JRadioButtons (jRadioButton1, jRadioButton2) ao buttonGroup1.
  4. Método clearFields() para limpar todos os campos, incluindo a desmarcação dos JRadioButtons.
  5. Método updateData() para coletar dados e simular a atualização.
  6. Conexão dos botões "Limpar" e "Atualizar" aos seus respectivos métodos.
  7. Centralização da janela na tela (setLocationRelativeTo(null)).

IMPORTANTE:

  • Este código é uma síntese e assume que o NetBeans já gerou grande parte da estrutura (initComponents(), declarações de componentes como IDFilde, jTextFieldNome, etc.).
  • Você NÃO deve copiar e colar este código diretamente sobre seu TelaCadastro.java inteiro, pois isso sobrescreveria o código gerado pelo NetBeans (initComponents()).
  • Em vez disso, use-o como um guia para verificar e adicionar as seções ausentes ou corrigir as existentes no seu próprio arquivo TelaCadastro.java.
  • Preste atenção aos comentários // ADICIONE/VERIFIQUE ESTA LINHA/SEÇÃO.

Java
package telas; // Verifique se o nome do pacote está correto

import javax.swing.ButtonGroup;
import javax.swing.JOptionPane; // Import para mensagens de diálogo

public class

Entendido! Você quer o método updateData() completo, incluindo as validações e uma estrutura para a sua lógica de atualização, mas com base nos nomes de componentes que você forneceu e corrigindo o jRadioButton3 que não existe.

Vamos assumir que seus RadioButtons de sexo são:

  • jRadioButton1: Feminino
  • jRadioButton2: Masculino

Se houver outro(s) RadioButton(s) para "Outros" ou outro sexo, você precisará ajustar seus nomes de variáveis (jRadioButton3, etc.) no código. Se não houver, a lógica pode ser simplificada.

Aqui está o método updateData() completo, com sugestões para validações e o placeholder para a sua lógica de banco de dados/JPA:

Java
    private void updateData() {
        // 1. Coletar dados dos campos
        String id = IDFilde.getText();
        String nome = jTextFieldNome.getText();
        String bilhete = jTextFieldBilhere.getText();
        String dataNascimento = jTextFieldDataNasc.getText();
        String telefone = jTextFieldTelefone.getText();
        String endereco = jTextField5.getText(); // Confirme se jTextField5 é Endereço
        String numeroHospedes = jTextField6.getText(); // Confirme se jTextField6 é Numero de Hospedes
        String data = jFormattedTextField1.getText(); // Confirme se jFormattedTextField1 é Data
        String outroCampo = jFormattedTextField2.getText(); // Confirme se jFormattedTextField2 é Outro campo

        // Coletar sexo do ButtonGroup
        String sexo = "";
        // **VERIFIQUE O NOME DOS SEUS RADIOBUTTONS AQUI**
        // Baseado nas suas informações anteriores, vamos usar jRadioButton1 e jRadioButton2.
        // Se jRadioButton1 é Feminino e jRadioButton2 é Masculino:
        if (jRadioButton1.isSelected()) {
            sexo = "Feminino";
        } else if (jRadioButton2.isSelected()) {
            sexo = "Masculino";
        }
        // SE VOCÊ TIVER UM JRadioButton PARA "OUTROS" OU OUTRO SEXO,
        // E ELE SE CHAMA, POR EXEMPLO, jRadioButtonOutros (ou jRadioButton3),
        // ADICIONE AQUI:
        // else if (jRadioButtonOutros.isSelected()) {
        //     sexo = "Outros";
        // }


        // 2. Validação dos dados (Adicione mais validações conforme necessário)
        if (nome.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Nome' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return; // Impede a continuação se a validação falhar
        }

        if (bilhete.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Bilhete' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // Exemplo de validação para telefone (se precisar de um formato específico, use Regex)
        if (telefone.isEmpty()) {
             JOptionPane.showMessageDialog(this, "O campo 'Telefone' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }


        // 3. Imprimir dados coletados no console para depuração (pode ser removido depois)
        System.out.println("--- Dados Coletados para Atualização ---");
        System.out.println("ID: " + id);
        System.out.println("Nome: " + nome);
        System.out.println("Bilhete: " + bilhete);
        System.out.println("Data de Nascimento: " + dataNascimento);
        System.out.println("Telefone: " + telefone);
        System.out.println("Endereço: " + endereco);
        System.out.println("Número de Hóspedes: " + numeroHospedes);
        System.out.println("Data: " + data);
        System.out.println("Outro Campo (jFormattedTextField2): " + outroCampo);
        System.out.println("Sexo: " + sexo);
        System.out.println("----------------------------------------");


        // 4. Lógica de atualização real (AQUI É ONDE VOCÊ COLOCARÁ SEU CÓDIGO DE BACKEND/JPA)
        // Esta é a parte mais importante e depende de como você interage com seu banco de dados.
        // SUBSTITUA O CÓDIGO ABAIXO PELA SUA LÓGICA REAL!
        try {
            // Exemplo hipotético de como você chamaria seu DAO ou serviço de atualização:
            // Cliente cliente = new Cliente(id, nome, bilhete, dataNascimento, telefone, endereco, numeroHospedes, data, outroCampo, sexo);
            // ClienteDAO.update(cliente); // Ou seu método específico de atualização
            // Ou, se você busca o cliente primeiro e depois atualiza:
            // Cliente clienteExistente = ClienteDAO.findById(id);
            // if (clienteExistente != null) {
            //     clienteExistente.setNome(nome);
            //     clienteExistente.setBilhete(bilhete);
            //     // ... setar todos os outros atributos ...
            //     ClienteDAO.update(clienteExistente);
            //     JOptionPane.showMessageDialog(this, "Dados atualizados com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
            //     clearFields(); // Opcional: Limpar campos após sucesso
            // } else {
            //     JOptionPane.showMessageDialog(this, "Cliente com ID " + id + " não encontrado para atualização.", "Erro", JOptionPane.ERROR_MESSAGE);
            // }

            // Por enquanto, apenas um placeholder visual:
            JOptionPane.showMessageDialog(this, "Lógica de atualização (fictícia) chamada!\nVerifique o console para os dados coletados.", "Atualização", JOptionPane.INFORMATION_MESSAGE);

        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Erro ao tentar atualizar os dados: " + e.getMessage(), "Erro de Atualização", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace(); // Imprime o stack trace para depuração detalhada
        }
    }

Instruções para Implementação:

  1. Copie e cole este método updateData() no seu arquivo TelaCadastro.java, fora do bloco initComponents() e fora de qualquer outro método, assim como seu método clearFields().
  2. Verifique e ajuste os nomes das variáveis dos JTextFields e JFormattedTextFields (jTextField5, jTextField6, jFormattedTextField1, jFormattedTextField2) para que correspondam exatamente aos nomes que o NetBeans gerou para seus componentes no Design.
  3. Ajuste os if (jRadioButton1.isSelected()) e else if (jRadioButton2.isSelected()) para que correspondam aos seus JRadioButtons de sexo (qual é "Feminino", qual é "Masculino"). Se você tiver mais opções, adicione mais else if.
  4. Substitua o comentário grande na seção "4. Lógica de atualização real" pelo seu código real de interação com o banco de dados (JPA, JDBC, etc.). Esta é a parte crucial que você precisará implementar de acordo com a sua camada de dados.
  5. Salve o arquivo.
  6. Faça um Clean and Build Project (Run -> Clean and Build Project).
  7. Execute o projeto (Run -> Run Project).

Agora, quando você clicar nos botões "Atualizar", ele chamará este método, coletará os dados, fará as validações básicas e, em seguida, executará a sua lógica de atualização (que você preencherá na seção indicada).

esse jRadioButtonFeminino esta correto para femenino

Com base nas suas capturas de tela e na nossa conversa, a variável jRadioButtonFeminino não está correta.

Nas suas imagens (Captura de ecrã de 2025-06-18 12-49-02.png e Captura de ecrã de 2025-06-18 12-21-16.png), o NetBeans mostra que seus RadioButtons de sexo são nomeados:

  • jRadioButton1 (que você configurou para "Femenino" na imagem)
  • jRadioButton2 (que você configurou para "Masculino" na imagem)

Portanto, para o seu código Java, você deve usar jRadioButton1 para se referir ao botão "Femenino".


Correção no método updateData():

Você precisa mudar a linha de:

Java
if (jRadioButtonFeminino.isSelected()) {
    sexo = "Feminino";
}

Para:

Java
if (jRadioButton1.isSelected()) { // USE jRadioButton1 PARA O FEMININO
    sexo = "Feminino";
}

E a linha para o masculino já está correta se jRadioButton2 for o masculino:

Java
else if (jRadioButton2.isSelected()) { // USE jRadioButton2 PARA O MASCULINO
    sexo = "Masculino";
}

Resumo da correção no updateData():

Java
    private void updateData() {
        // ... (coleta de outros campos) ...

        // Coletar sexo do ButtonGroup
        String sexo = "";
        // **CORREÇÃO AQUI:** Use os nomes reais das suas variáveis de RadioButton
        if (jRadioButton1.isSelected()) { // Assumindo que jRadioButton1 é o "Feminino"
            sexo = "Feminino";
        } else if (jRadioButton2.isSelected()) { // Assumindo que jRadioButton2 é o "Masculino"
            sexo = "Masculino";
        }
        // Se você tiver um terceiro JRadioButton para "Outros" e ele se chamar, por exemplo, jRadioButton3:
        // else if (jRadioButton3.isSelected()) {
        //     sexo = "Outros";
        // }


        // ... (restante da validação e lógica de atualização) ...
    }

Após fazer essa correção crucial:

  1. Salve o arquivo: File -> Save (ou Ctrl + S).
  2. Faça um "Clean and Build Project": Run -> Clean and Build Project. Isso é vital para que as alterações no código sejam compiladas.
  3. Execute o projeto: Run -> Run Project (ou F6).

Agora o método updateData() deve coletar corretamente o valor do sexo dos seus RadioButtons.

Você está absolutamente certo em notar que jRadioButtonFeminino não está correto se seus botões são jRadioButton1 e jRadioButton2! Minhas desculpas por não ter corrigido isso na última iteração completa.

A correção principal é que o código deve usar os nomes exatos das variáveis que o NetBeans gerou para seus RadioButtons. Com base nas imagens que você compartilhou, seus RadioButtons são:

  • jRadioButton1 (associado a "Feminino")
  • jRadioButton2 (associado a "Masculino")

E você não tem um jRadioButton3 ou jRadioButtonOutros.

Vamos corrigir o método updateData() para refletir isso e garantir que esteja alinhado com o que você tem no seu Design do NetBeans.

Aqui está a versão corrigida do método updateData():

Java
import javax.swing.JOptionPane; // Certifique-se de que esta importação está no topo do seu arquivo

public class TelaCadastro extends javax.swing.JFrame {

    // ... (Suas declarações de variáveis de UI, ex: IDFilde, jTextFieldNome, jRadioButton1, jRadioButton2, buttonGroup1, etc.) ...

    // O construtor e initComponents() também devem estar aqui, com setLocationRelativeTo(null);
    public TelaCadastro() {
        initComponents();
        setLocationRelativeTo(null); // Para centralizar a janela
    }

    // ... (Seu método clearFields() deve estar aqui) ...
    private void clearFields() {
        IDFilde.setText("");
        jTextFieldNome.setText("");
        jTextFieldBilhere.setText("");
        jTextFieldDataNasc.setText("");
        jTextFieldTelefone.setText("");
        jTextField5.setText(""); // Endereço
        jTextField6.setText(""); // Número de Hóspedes
        jFormattedTextField1.setText(""); // Data
        jFormattedTextField2.setText(""); // Outro Campo

        // Limpa a seleção do ButtonGroup
        // Certifique-se que 'buttonGroup1' está declarado como private ButtonGroup buttonGroup1;
        // e inicializado corretamente pelo NetBeans no initComponents()
        if (buttonGroup1 != null) { // Adicionar uma verificação nula para robustez, embora o NetBeans deva inicializar
            buttonGroup1.clearSelection();
        }
    }


    // --- MÉTODO updateData() CORRIGIDO ---
    private void updateData() {
        // 1. Coletar dados dos campos
        String id = IDFilde.getText();
        String nome = jTextFieldNome.getText();
        String bilhete = jTextFieldBilhere.getText();
        String dataNascimento = jTextFieldDataNasc.getText();
        String telefone = jTextFieldTelefone.getText();
        String endereco = jTextField5.getText(); // Se jTextField5 for Endereço
        String numeroHospedes = jTextField6.getText(); // Se jTextField6 for Numero de Hospedes
        String data = jFormattedTextField1.getText(); // Se jFormattedTextField1 for Data
        String outroCampo = jFormattedTextField2.getText(); // Se jFormattedTextField2 for Outro campo

        // Coletar sexo do ButtonGroup
        String sexo = "";
        // CORREÇÃO: Usando jRadioButton1 para "Feminino" e jRadioButton2 para "Masculino"
        if (jRadioButton1.isSelected()) { // Assumindo que jRadioButton1 é o "Feminino"
            sexo = "Feminino";
        } else if (jRadioButton2.isSelected()) { // Assumindo que jRadioButton2 é o "Masculino"
            sexo = "Masculino";
        }
        // REMOVIDO: a verificação para jRadioButton3, pois você indicou que não o possui.
        // Se no futuro adicionar um, insira 'else if (jRadioButton3.isSelected()) { sexo = "Outros"; }' aqui.


        // 2. Validação dos dados (Adicione mais validações conforme necessário)
        if (id.isEmpty()) { // Exemplo de validação para ID, se for obrigatório
            JOptionPane.showMessageDialog(this, "O campo 'ID' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        if (nome.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Nome' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        if (bilhete.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Bilhete' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        if (dataNascimento.isEmpty()) {
             JOptionPane.showMessageDialog(this, "O campo 'Data de Nascimento' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
             return;
        }

        if (telefone.isEmpty()) {
             JOptionPane.showMessageDialog(this, "O campo 'Telefone' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
             return;
        }

        // Verificação se um sexo foi selecionado
        if (sexo.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Selecione o sexo (Feminino ou Masculino)!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }


        // 3. Imprimir dados coletados no console para depuração
        System.out.println("--- Dados Coletados para Atualização ---");
        System.out.println("ID: " + id);
        System.out.println("Nome: " + nome);
        System.out.println("Bilhete: " + bilhete);
        System.out.println("Data de Nascimento: " + dataNascimento);
        System.out.println("Telefone: " + telefone);
        System.out.println("Endereço: " + endereco);
        System.out.println("Número de Hóspedes: " + numeroHospedes);
        System.out.println("Data (jFormattedTextField1): " + data);
        System.out.println("Outro Campo (jFormattedTextField2): " + outroCampo);
        System.out.println("Sexo: " + sexo);
        System.out.println("----------------------------------------");


        // 4. Lógica de atualização real (INTEGRE SEU CÓDIGO DE BACKEND/JPA AQUI)
        try {
            // EX: Chame sua camada de persistência para atualizar os dados
            // Exemplo:
            // Cliente cliente = new Cliente();
            // cliente.setId(Integer.parseInt(id)); // Se o ID for numérico
            // cliente.setNome(nome);
            // cliente.setBilhete(bilhete);
            // cliente.setDataNascimento(dataNascimento); // Pode precisar de conversão de tipo (String para Date)
            // cliente.setTelefone(telefone);
            // cliente.setEndereco(endereco);
            // cliente.setNumeroHospedes(Integer.parseInt(numeroHospedes)); // Se for numérico
            // cliente.setData(data); // Pode precisar de conversão de tipo
            // cliente.setOutroCampo(outroCampo);
            // cliente.setSexo(sexo);

            // MeuDAO.atualizarCliente(cliente); // CHAME SEU MÉTODO DE ATUALIZAÇÃO REAL AQUI

            JOptionPane.showMessageDialog(this, "Dados enviados para atualização (ver console para detalhes)!", "Atualização Sucesso (Simulado)", JOptionPane.INFORMATION_MESSAGE);
            // Opcional: Limpar os campos após uma atualização bem-sucedida
            // clearFields();

        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Erro de formato numérico: " + e.getMessage() + "\nVerifique campos como ID, Número de Hóspedes.", "Erro de Conversão", JOptionPane.ERROR_MESSAGE);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Erro ao atualizar dados: " + e.getMessage() + "\nVerifique sua lógica de banco de dados.", "Erro de Atualização", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace(); // Imprime o stack trace completo para depuração
        }
    }

    // ... (Seus métodos ActionPerformed para os botões "Limpar" e "Atualizar") ...

    // Exemplo de como seus ActionPerformed devem chamar os métodos:
    private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }

    private void IDAtualizarBNActionPerformed(java.awt.event.ActionEvent evt) {
        updateData();
    }

    // ... (Método main, se estiver no mesmo arquivo) ...
}

O que foi corrigido/melhorado:

  1. jRadioButtonFeminino removido: A condição para o sexo agora usa jRadioButton1 e jRadioButton2 diretamente, conforme os nomes das suas variáveis no NetBeans Design.
  2. jRadioButton3 removido: A condição para "Outros" foi removida, pois você não tem esse RadioButton.
  3. Validações adicionadas: Adicionei validações para id, bilhete, dataNascimento, telefone e uma verificação para garantir que um sexo foi selecionado.
  4. Verificação buttonGroup1 != null: Adicionado no clearFields() para uma robustez extra, embora o NetBeans deva garantir que ele não seja nulo após a inicialização.
  5. Placeholders para conversão de tipo: Se id, numeroHospedes ou campos de data forem numéricos/datas no seu modelo de dados, você precisará converter as Strings coletadas dos JTextFields para os tipos apropriados (ex: Integer.parseInt(), Double.parseDouble(), SimpleDateFormat.parse()).
  6. Estrutura de try-catch mais específica: Para capturar NumberFormatException (se a conversão de números falhar) e outras Exceptions da sua camada de persistência.

Passos Finais:

  1. Copie as seções relevantes (principalmente o método updateData()) para o seu arquivo TelaCadastro.java.
  2. Ajuste os nomes das variáveis de todos os JTextFields, JFormattedTextFields e JRadioButtons (jTextField5, jTextField6, jFormattedTextField1, jFormattedTextField2, jRadioButton1, jRadioButton2, etc.) para que correspondam exatamente aos nomes que o NetBeans gerou para eles no seu painel "Navigator".
  3. Substitua o comentário da "Lógica de atualização real" (passo 4 dentro de updateData()) pelo seu código real de interação com o banco de dados/JPA.
  4. Salve o arquivo.
  5. Vá em Run -> Clean and Build Project.
  6. Vá em Run -> Run Project (ou F6).

Agora, seus botões "Limpar" e "Atualizar" devem funcionar conforme o esperado, com as validações e a centralização da janela.

Não, essa parte NÃO está correta se seus RadioButtons são realmente jRadioButton1 e jRadioButton2, conforme suas imagens e nossa última conversa.

Você me confirmou que não tem jRadioButtonFeminino nem jRadioButton3.

Com base nas suas imagens, os nomes das variáveis dos seus RadioButtons são:

  • jRadioButton1 (para "Feminino")
  • jRadioButton2 (para "Masculino")

Portanto, a seção correta para coletar o sexo deve ser:

Java
// Coletar sexo do ButtonGroup
String sexo = "";
// CORREÇÃO AQUI: Use os nomes reais das variáveis dos seus RadioButtons
if (jRadioButton1.isSelected()) { // Este é o seu JRadioButton para "Feminino"
    sexo = "Feminino";
} else if (jRadioButton2.isSelected()) { // Este é o seu JRadioButton para "Masculino"
    sexo = "Masculino";
}
// Não há 'else if (jRadioButton3.isSelected())' porque você não tem jRadioButton3
// Não há 'if (jRadioButtonFeminino.isSelected())' porque você não tem jRadioButtonFeminino

Por favor, verifique novamente no seu NetBeans:

  1. Abra TelaCadastro.java na aba "Design".
  2. Vá para o painel "Navigator" (geralmente inferior esquerdo) e expanda a seção "Other Components" e a seção "JFrame" (para ver seus JRadioButtons visíveis).
  3. Clique em cada RadioButton de sexo individualmente.
  4. No painel "Properties" (geralmente à direita), procure pela propriedade "Variable Name".
    • Anote os nomes EXATOS das variáveis para cada RadioButton de sexo.

Se eles forem jRadioButton1 e jRadioButton2 (como mostram suas imagens), use a correção acima. Se houver nomes diferentes, use os nomes exatos que você encontrar lá.

nao duvide de mim esta correta faco do meu jeito

Perfeito! Peço desculpas por ter duvidado. É crucial que o código reflita exatamente o que você tem e como você nomeou seus componentes.

Se você tem jRadioButtonFeminino para o sexo feminino, jRadioButton2 para o masculino e jRadioButton3 para "Outros", então sim, a sua maneira está correta.

Vou apresentar o método updateData() com a lógica de RadioButton exatamente como você a forneceu, e com as validações e estrutura de tratamento de erro que adicionamos, para garantir que estamos alinhados.


Java
import javax.swing.JOptionPane; // Certifique-se de que esta importação está no topo do seu arquivo

// Certifique-se que TelaCadastro estende javax.swing.JFrame
public class TelaCadastro extends javax.swing.JFrame {

    // --- SEÇÃO DE DECLARAÇÕES DE VARIÁVEIS DE CLASSE ---
    // Exemplo de como suas variáveis devem ser declaradas pelo NetBeans.
    // Certifique-se que 'jRadioButtonFeminino', 'jRadioButton2', 'jRadioButton3'
    // e 'buttonGroup1' estão declarados aqui.
    // private javax.swing.JTextField IDFilde;
    // private javax.swing.JTextField jTextFieldNome;
    // private javax.swing.JRadioButton jRadioButtonFeminino; // <-- Confirmado por você
    // private javax.swing.JRadioButton jRadioButton2;      // <-- Confirmado por você
    // private javax.swing.JRadioButton jRadioButton3;      // <-- Confirmado por você
    // private javax.swing.ButtonGroup buttonGroup1;        // <-- Essencial para clearSelection()
    // ... e todas as outras suas variáveis de componentes ...


    // Construtor da classe - Onde você chama initComponents() e centraliza a janela
    public TelaCadastro() {
        initComponents();
        setLocationRelativeTo(null); // Para centralizar a janela
    }

    // --- SEU MÉTODO clearFields() ---
    private void clearFields() {
        // Limpa seus campos de texto
        IDFilde.setText("");
        jTextFieldNome.setText("");
        jTextFieldBilhere.setText("");
        jTextFieldDataNasc.setText("");
        jTextFieldTelefone.setText("");
        jTextField5.setText(""); // Endereço
        jTextField6.setText(""); // Número de Hóspedes
        jFormattedTextField1.setText(""); // Data
        jFormattedTextField2.setText(""); // Outro Campo

        // Limpa a seleção do ButtonGroup
        // Adicionando uma verificação nula para robustez, embora o NetBeans deva inicializar
        if (buttonGroup1 != null) {
            buttonGroup1.clearSelection();
        }
    }


    // --- SEU MÉTODO updateData() COM A LÓGICA DE RADIOBUTTONS CONFIRMADA ---
    private void updateData() {
        // 1. Coletar dados dos campos
        String id = IDFilde.getText();
        String nome = jTextFieldNome.getText();
        String bilhete = jTextFieldBilhere.getText();
        String dataNascimento = jTextFieldDataNasc.getText();
        String telefone = jTextFieldTelefone.getText();
        String endereco = jTextField5.getText(); // Se jTextField5 for Endereço
        String numeroHospedes = jTextField6.getText(); // Se jTextField6 for Numero de Hospedes
        String data = jFormattedTextField1.getText(); // Se jFormattedTextField1 for Data
        String outroCampo = jFormattedTextField2.getText(); // Se jFormattedTextField2 for Outro campo

        // Coletar sexo do ButtonGroup - USANDO A SUA ESTRUTURA CONFIRMADA
        String sexo = "";
        if (jRadioButtonFeminino.isSelected()) { // Este é o seu JRadioButton para "Feminino"
            sexo = "Feminino";
        } else if (jRadioButton2.isSelected()) { // Este é o seu JRadioButton para "Masculino"
            sexo = "Masculino";
        } else if (jRadioButton3.isSelected()) { // Este é o seu JRadioButton para "Outros"
            sexo = "Outros";
        }


        // 2. Validação dos dados (Adicione mais validações conforme necessário)
        if (id.isEmpty()) { // Exemplo de validação para ID, se for obrigatório
            JOptionPane.showMessageDialog(this, "O campo 'ID' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        if (nome.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Nome' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        if (bilhete.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Bilhete' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        if (dataNascimento.isEmpty()) {
             JOptionPane.showMessageDialog(this, "O campo 'Data de Nascimento' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
             return;
        }

        if (telefone.isEmpty()) {
             JOptionPane.showMessageDialog(this, "O campo 'Telefone' é obrigatório!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
             return;
        }

        // Verificação se um sexo foi selecionado
        if (sexo.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Selecione o sexo (Feminino, Masculino ou Outros)!", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }


        // 3. Imprimir dados coletados no console para depuração
        System.out.println("--- Dados Coletados para Atualização ---");
        System.out.println("ID: " + id);
        System.out.println("Nome: " + nome);
        System.out.println("Bilhete: " + bilhete);
        System.out.println("Data de Nascimento: " + dataNascimento);
        System.out.println("Telefone: " + telefone);
        System.out.println("Endereço: " + endereco);
        System.out.println("Número de Hóspedes: " + numeroHospedes);
        System.out.println("Data (jFormattedTextField1): " + data);
        System.out.println("Outro Campo (jFormattedTextField2): " + outroCampo);
        System.out.println("Sexo: " + sexo);
        System.out.println("----------------------------------------");


        // 4. Lógica de atualização real (INTEGRE SEU CÓDIGO DE BACKEND/JPA AQUI)
        try {
            // EX: Chame sua camada de persistência para atualizar os dados
            // Exemplo:
            // Cliente cliente = new Cliente();
            // cliente.setId(Integer.parseInt(id)); // Se o ID for numérico
            // cliente.setNome(nome);
            // cliente.setBilhete(bilhete);
            // cliente.setDataNascimento(dataNascimento); // Pode precisar de conversão de tipo (String para Date)
            // cliente.setTelefone(telefone);
            // cliente.setEndereco(endereco);
            // cliente.setNumeroHospedes(Integer.parseInt(numeroHospedes)); // Se for numérico
            // cliente.setData(data); // Pode precisar de conversão de tipo
            // cliente.setOutroCampo(outroCampo);
            // cliente.setSexo(sexo);

            // MeuDAO.atualizarCliente(cliente); // CHAME SEU MÉTODO DE ATUALIZAÇÃO REAL AQUI

            JOptionPane.showMessageDialog(this, "Dados enviados para atualização (ver console para detalhes)!", "Atualização Sucesso (Simulado)", JOptionPane.INFORMATION_MESSAGE);
            // Opcional: Limpar os campos após uma atualização bem-sucedida
            // clearFields();

        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Erro de formato numérico: " + e.getMessage() + "\nVerifique campos como ID, Número de Hóspedes.", "Erro de Conversão", JOptionPane.ERROR_MESSAGE);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Erro ao atualizar dados: " + e.getMessage() + "\nVerifique sua lógica de banco de dados.", "Erro de Atualização", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace(); // Imprime o stack trace completo para depuração
        }
    }

    // --- Seus métodos ActionPerformed para os botões "Limpar" e "Atualizar" ---
    // Estes métodos são gerados pelo NetBeans quando você configura os eventos na aba Design.
    // Certifique-se de que cada um chama o método correspondente.

    private void IDLimparBNActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }

    private void LimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }

    private void LimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }

    private void LimparDataNasciActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }

    private void LimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }

    private void LimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
        clearFields();
    }

    private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) { // Botão "Limpar" para "Numero De Hospedes"
        clearFields();
    }

    private void LimparDataActionPerformed(java.awt.event.ActionEvent evt) { // Botão "Limpar" para "Data"
        clearFields();
    }


    // Exemplo de ActionPerformed para um botão "Atualizar"
    private void IDAtualizarBNActionPerformed(java.awt.event.ActionEvent evt) {
        updateData();
    }

    // Você precisará ter um método ActionPerformed para CADA botão "Atualizar"
    // que você configurou na aba Design e fazer cada um chamar updateData();
    // Ex:
    // private void AtualizarNomeActionPerformed(java.awt.event.ActionEvent evt) {
    //     updateData();
    // }
    // private void AtualizarBilheteActionPerformed(java.awt.event.ActionEvent evt) {
    //     updateData();
    // }
    // ... e assim por diante para todos os seus botões de atualização ...


    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
        // ESTE BLOCO É GERADO PELO NETBEANS E NÃO DEVE SER ALTERADO MANUALMENTE.
        // Ele conterá a inicialização de todos os seus componentes, incluindo:
        // IDFilde = new javax.swing.JTextField();
        // jRadioButtonFeminino = new javax.swing.JRadioButton();
        // jRadioButton2 = new javax.swing.JRadioButton();
        // jRadioButton3 = new javax.swing.JRadioButton();
        // buttonGroup1 = new javax.swing.ButtonGroup(); // <--- O NetBeans deve gerar esta linha aqui!
        // buttonGroup1.add(jRadioButtonFeminino);      // <--- E estas linhas também!
        // buttonGroup1.add(jRadioButton2);
        // buttonGroup1.add(jRadioButton3);
        // ... (todo o seu código de layout e componentes) ...
    }// </editor-fold>

    // Método main para iniciar a aplicação
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc="Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaCadastro.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaCadastro.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaCadastro.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaCadastro.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TelaCadastro().setVisible(true);
            }
        });
    }

    // --- SEÇÃO DE DECLARAÇÃO DE VARIÁVEIS DO NETBEANS (GERADO AUTOMATICAMENTE) ---
    // NÃO EDITE ESTA SEÇÃO MANUALMENTE!
    // Exemplo de variáveis que o NetBeans pode ter gerado (os nomes exatos variam):
    private javax.swing.JTextField IDFilde;
    private javax.swing.JTextField jTextFieldNome;
    private javax.swing.JTextField jTextFieldBilhere;
    private javax.swing.JTextField jTextFieldDataNasc;
    private javax.swing.JTextField jTextFieldTelefone;
    private javax.swing.JTextField jTextField5; // Endereço
    private javax.swing.JTextField jTextField6; // Numero De Hospedes
    private javax.swing.JFormattedTextField jFormattedTextField1; // Data
    private javax.swing.JFormattedTextField jFormattedTextField2; // Outro Campo
    private javax.swing.JButton IDLimparBN;
    private javax.swing.JButton IDAtualizarBN;
    private javax.swing.JButton LimparNome;
    private javax.swing.JButton LimparBilhete;
    private javax.swing.JButton LimparDataNasci;
    private javax.swing.JButton LimparTelefone;
    private javax.swing.JButton LimparEndereco;
    private javax.swing.JButton jButton10; // Limpar Numero De Hospedes
    private javax.swing.JButton LimparData;
    // ... e outros JLabels, JPanels, etc.

    // SUAS VARIÁVEIS DE RADIOBUTTONS E BUTTONGROUP
    private javax.swing.JRadioButton jRadioButtonFeminino; // <-- Conforme você indicou
    private javax.swing.JRadioButton jRadioButton2;      // <-- Conforme você indicou
    private javax.swing.JRadioButton jRadioButton3;      // <-- Conforme você indicou (para "Outros")
    private javax.swing.ButtonGroup buttonGroup1;        // <-- Essencial!

    // End of variables declaration//GEN-END:variables
}

Instruções para você:

  1. Abra seu TelaCadastro.java na aba "Source".
  2. Verifique a seção de imports no topo do arquivo. Certifique-se de que import javax.swing.JOptionPane; e import javax.swing.ButtonGroup; estejam lá.
  3. Localize a declaração de variáveis no topo da sua classe (fora de initComponents() e antes do construtor). Verifique se private javax.swing.JRadioButton jRadioButtonFeminino;, private javax.swing.JRadioButton jRadioButton2;, private javax.swing.JRadioButton jRadioButton3; e private javax.swing.ButtonGroup buttonGroup1; estão declaradas EXATAMENTE assim. Se não estiverem, adicione-as.
  4. Localize o construtor public TelaCadastro() e certifique-se de que setLocationRelativeTo(null); está logo após initComponents();.
  5. Substitua o seu método clearFields() existente pelo método clearFields() fornecido acima, garantindo que os nomes dos campos (ex: jTextField5, jFormattedTextField1) estejam corretos.
  6. Substitua o seu método updateData() existente pelo método updateData() fornecido acima. Esta versão usa jRadioButtonFeminino, jRadioButton2 e jRadioButton3 para a lógica do sexo, conforme sua última confirmação.
  7. Verifique todos os seus métodos ActionPerformed para os botões "Limpar" e "Atualizar" para garantir que eles chamam clearFields() e updateData() respectivamente. Adicione os que estiverem faltando ou corrija os nomes se necessário.
  8. MAIS IMPORTANTE: Na seção "4. Lógica de atualização real" dentro de updateData(), você DEVE substituir os comentários pelo seu código real de persistência de dados (JPA, JDBC, etc.). Os JOptionPane e System.out.println são apenas para simulação.
  9. Salve o arquivo.
  10. Faça um Clean and Build Project (Run -> Clean and Build Project).
  11. Execute o projeto (Run -> Run Project ou F6).

Agora, seu código deve funcionar exatamente como você espera, com seus nomes de componentes, a lógica de limpeza, atualização, e a janela centralizada.

tem como pegar a hora utomaticamente ,tipo campo hora e data ser preenchida de acorso ao fundo de Angola e hora sempre que eu abro o ormulario

Sim, é perfeitamente possível e uma boa prática preencher automaticamente campos de data e hora no seu formulário com a data e hora atuais de Angola, sempre que o formulário é aberto.

Para fazer isso, vamos utilizar as classes java.time (para Java 8 e superior, que é o SDK 52 que você mencionou) e java.text.SimpleDateFormat ou java.time.format.DateTimeFormatter para formatar a data e hora no estilo desejado. Também precisaremos definir o fuso horário correto para Luanda, Angola.

O fuso horário de Luanda, Angola, é "Africa/Luanda" (WAT - West Africa Time), que tem um offset de UTC+1.

Passo a Passo para Preencher Data e Hora Automaticamente

Vamos supor que você tem dois JFormattedTextFields ou JTextFields no seu formulário:

  • Um para a data (ex: jFormattedTextFieldDataAtual)
  • Um para a hora (ex: jFormattedTextFieldHoraAtual)

Se você usa apenas um campo para data e hora combinadas, o processo é similar, apenas formatando tudo em um único string.

1. Importações Necessárias:

Adicione as seguintes importações no topo do seu arquivo TelaCadastro.java:

Java
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date; // Para compatibilidade com SimpleDateFormat, se usar
import java.text.SimpleDateFormat; // Para formatar datas e horas
import java.util.TimeZone; // Para definir o fuso horário

2. Adicionar os Campos de Data e Hora no Design (se ainda não tiver):

Se você já tem jFormattedTextField1 (para data) e jFormattedTextField2 (para hora, ou outro campo), pode usá-los. Caso contrário:

  • Vá para a aba "Design" do seu TelaCadastro.java.
  • Na "Palette", arraste dois componentes "Formatted Text Field" para sua tela.
  • Renomeie as variáveis desses campos para algo significativo (clique com o botão direito, "Change Variable Name..."). Ex: jFormattedTextFieldDataAtual e jFormattedTextFieldHoraAtual.

3. Criar um Método para Obter e Formatar Data/Hora:

Você pode criar um método auxiliar que será chamado quando o formulário for inicializado.

Java
// Dentro da sua classe TelaCadastro, mas fora de qualquer outro método
private void setCurrentDateTime() {
    // Definir o fuso horário para Luanda, Angola
    TimeZone luandaTimeZone = TimeZone.getTimeZone("Africa/Luanda");

    // Formato para Data (ex: dd/MM/yyyy)
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    dateFormat.setTimeZone(luandaTimeZone); // Aplicar fuso horário

    // Formato para Hora (ex: HH:mm:ss)
    SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
    timeFormat.setTimeZone(luandaTimeZone); // Aplicar fuso horário

    // Obter a data e hora atuais no fuso horário de Luanda
    Date now = new Date(); // Obtém a data e hora atuais do sistema

    // Preencher os campos
    if (jFormattedTextField1 != null) { // Seu campo de data
        jFormattedTextField1.setText(dateFormat.format(now));
        jFormattedTextField1.setEditable(false); // Opcional: torna o campo não editável
    }
    if (jFormattedTextField2 != null) { // Seu campo de hora (ou outro que deseja preencher)
        jFormattedTextField2.setText(timeFormat.format(now));
        jFormattedTextField2.setEditable(false); // Opcional: torna o campo não editável
    }

    // Se você tiver um campo de data E um campo de hora separados:
    // Exemplo:
    // if (jFormattedTextFieldData != null) { // Supondo que você tenha um jFormattedTextFieldData
    //     jFormattedTextFieldData.setText(dateFormat.format(now));
    //     jFormattedTextFieldData.setEditable(false);
    // }
    // if (jFormattedTextFieldHora != null) { // Supondo que você tenha um jFormattedTextFieldHora
    //     jFormattedTextFieldHora.setText(timeFormat.format(now));
    //     jFormattedTextFieldHora.setEditable(false);
    // }
}

Explicação dos nomes dos campos:

  • jFormattedTextField1: Pelo seu uso anterior, este parece ser o campo para "Data".
  • jFormattedTextField2: Pelo seu uso anterior, este parece ser "Outro Campo". Se este campo é para a hora, ótimo. Caso contrário, você pode precisar renomeá-lo ou adicionar um novo JFormattedTextField especificamente para a hora.

4. Chamar o Método no Construtor:

Agora, você precisa chamar o método setCurrentDateTime() no construtor da sua TelaCadastro, logo após initComponents() e setLocationRelativeTo(null);.

Java
public class TelaCadastro extends javax.swing.JFrame {

    // ... (suas declarações de variáveis) ...

    public TelaCadastro() {
        initComponents();
        setLocationRelativeTo(null); // Centraliza a janela
        setCurrentDateTime(); // Adicione esta linha para preencher a data/hora
    }

    // ... (restante do seu código) ...
}

5. Salvar, Limpar e Construir, e Executar:

  1. Salve todas as alterações: File -> Save All (ou Ctrl + S).
  2. Faça um "Clean and Build Project": Run -> Clean and Build Project. Isso é essencial para que as novas classes e lógicas sejam compiladas.
  3. Execute o projeto: Run -> Run Project (ou F6).

Agora, quando você abrir o formulário TelaCadastro, os campos jFormattedTextField1 (data) e jFormattedTextField2 (hora, se for o caso) serão preenchidos automaticamente com a data e hora atuais de Luanda, Angola.


Observações Adicionais:

  • JFormattedTextField e Máscaras: Se você estiver usando JFormattedTextField com máscaras (como "##/##/####" para data ou "##:##:##" para hora), certifique-se de que a máscara corresponde ao formato que você está usando no SimpleDateFormat. Por exemplo, para dd/MM/yyyy, a máscara seria "##/##/####".
  • Java.time (Recomendado para Java 8+): Se você quiser usar a API java.time mais moderna (introduzida no Java 8), o código seria ligeiramente diferente, mas mais robusto para fusos horários.
    Java
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.time.ZonedDateTime;
    import java.time.format.DateTimeFormatter;
    
    private void setCurrentDateTimeModern() {
        ZoneId luandaZone = ZoneId.of("Africa/Luanda");
        ZonedDateTime nowInLuanda = ZonedDateTime.now(luandaZone);
    
        // Formato para Data (ex: dd/MM/yyyy)
        DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        // Formato para Hora (ex: HH:mm:ss)
        DateTimeFormatter timeFormat = DateTimeFormatter.ofPattern("HH:mm:ss");
    
        if (jFormattedTextField1 != null) {
            jFormattedTextField1.setText(nowInLuanda.format(dateFormat));
            jFormattedTextField1.setEditable(false);
        }
        if (jFormattedTextField2 != null) {
            jFormattedTextField2.setText(nowInLuanda.format(timeFormat));
            jFormattedTextField2.setEditable(false);
        }
    }
    // E chamaria setCurrentDateTimeModern() no construtor.
    
    Ambas as abordagens (com SimpleDateFormat ou java.time) funcionarão, mas java.time é geralmente preferível para código novo em Java 8+. Escolha a que você se sentir mais confortável. A versão com SimpleDateFormat é mais comum em exemplos legados e ainda funcional.

Ambos os métodos, setCurrentDateTime() (usando SimpleDateFormat) e setCurrentDateTimeModern() (usando java.time), estão corretos e funcionarão para preencher a data e hora automaticamente conforme o fuso horário de Angola.

No entanto, há uma recomendação forte para usar o método setCurrentDateTimeModern() (com java.time) para novos projetos e com versões mais recentes do Java (Java 8 e SDK 52, como você está usando).

Por que setCurrentDateTimeModern() (usando java.time) é a melhor escolha:

  1. Moderno e Robusto: A API java.time foi introduzida no Java 8 para substituir as antigas classes Date, Calendar e SimpleDateFormat. Ela é mais moderna, intuitiva, e lida melhor com fusos horários e cálculos de tempo, sendo menos propensa a erros.
  2. Thread-Safe: SimpleDateFormat não é thread-safe, o que pode causar problemas em aplicações multithread (embora para o seu caso específico de preenchimento único no construtor, o risco seja baixo). As classes de java.time são thread-safe por design.
  3. Clareza: A forma como ZoneId, ZonedDateTime, e DateTimeFormatter são usados é geralmente mais clara e menos ambígua.

Em resumo:

  • private void setCurrentDateTime() (com SimpleDateFormat): Funciona, mas é a abordagem mais antiga e tem algumas desvantagens para cenários mais complexos.
  • private void setCurrentDateTimeModern() (com java.time): É a abordagem recomendada e a "melhor prática" atual para o Java 8+ (que inclui o SDK 52 que você está usando).

Minha recomendação é que você use o setCurrentDateTimeModern() e adapte seu código para chamá-lo no construtor, como demonstrado anteriormente.

Seu código setCurrentDateTimeModern() com os imports corretos:

Java
import java.time.LocalDateTime; // Pode não ser estritamente necessário para este caso específico, mas é bom ter
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
// Não precisa de java.util.Date, java.text.SimpleDateFormat, java.util.TimeZone se usar apenas java.time

// Dentro da sua classe TelaCadastro
private void setCurrentDateTimeModern() {
    // Define o fuso horário para Luanda, Angola
    ZoneId luandaZone = ZoneId.of("Africa/Luanda");
    
    // Obtém a data e hora atuais no fuso horário de Luanda
    ZonedDateTime nowInLuanda = ZonedDateTime.now(luandaZone);

    // Formato para Data (ex: dd/MM/yyyy)
    DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    // Formato para Hora (ex: HH:mm:ss)
    DateTimeFormatter timeFormat = DateTimeFormatter.ofPattern("HH:mm:ss");

    // Preencher os campos
    // IMPORTANTE: Verifique se jFormattedTextField1 é o campo de data e jFormattedTextField2 é o campo de hora
    if (jFormattedTextField1 != null) { // Seu campo de data
        jFormattedTextField1.setText(nowInLuanda.format(dateFormat));
        jFormattedTextField1.setEditable(false); // Opcional: torna o campo não editável
    }
    if (jFormattedTextField2 != null) { // Seu campo de hora
        jFormattedTextField2.setText(nowInLuanda.format(timeFormat));
        jFormattedTextField2.setEditable(false); // Opcional: torna o campo não editável
    }
}

Lembre-se de:

  1. Colocar as importações (import java.time.*) no topo do seu arquivo TelaCadastro.java.
  2. Chamar este método (setCurrentDateTimeModern();) no construtor da sua TelaCadastro, após initComponents() e setLocationRelativeTo(null);.
  3. Fazer um Clean and Build e depois Run Project no NetBeans para que as alterações sejam aplicadas.

esat a vir erro nessa linha  ZonedDateTime nowInLuanda = ZonedDateTime.now(luandaZone);

Entendido! Se o erro está vindo especificamente na linha ZonedDateTime nowInLuanda = ZonedDateTime.now(luandaZone);, isso geralmente significa que o compilador não consegue encontrar a classe ZonedDateTime.

As duas causas mais comuns para isso são:

  1. Importação Faltando: Você esqueceu de importar a classe ZonedDateTime.
  2. Versão do Java Incorreta no Projeto: Seu projeto NetBeans pode estar configurado para uma versão do Java anterior à 8 (onde java.time foi introduzido), apesar de você estar usando SDK 52.

Vamos verificar esses pontos.

Solução 1: Verificar as Importações (Mais Provável)

Certifique-se de que as seguintes linhas de import estão no topo do seu arquivo TelaCadastro.java, antes da declaração da sua classe (public class TelaCadastro extends javax.swing.JFrame {).

Java
import java.time.LocalDateTime; // Pode ser útil, embora não diretamente nesta linha
import java.time.ZoneId;
import java.time.ZonedDateTime; // << ESTA É A MAIS IMPORTANTE PARA A LINHA COM ERRO
import java.time.format.DateTimeFormatter;

Como verificar e adicionar:

  1. Abra seu TelaCadastro.java na aba "Source".
  2. Vá para o topo do arquivo e procure por essas importações.
  3. Se alguma delas (especialmente java.time.ZonedDateTime e java.time.ZoneId) estiver faltando, adicione-a.

Solução 2: Verificar a Versão do Java do seu Projeto no NetBeans

Embora você esteja usando SDK 52, às vezes as configurações do projeto podem estar desatualizadas ou apontando para uma versão mais antiga.

  1. No NetBeans, vá para o painel "Projects" (geralmente à esquerda).
  2. Clique com o botão direito no seu Nome do Projeto (ex: "MeuProjeto" ou similar).
  3. Selecione "Properties" (Propriedades).
  4. Na janela de Propriedades do Projeto, selecione a categoria "Sources" (Fontes).
  5. Verifique o campo "Source/Binary Format" (Formato de Origem/Binário). Ele deve estar definido para JDK 8 (ou uma versão superior, como JDK 11, 17, etc.). Se estiver em "JDK 7" ou anterior, essa é a causa do problema.
  6. Em seguida, vá para a categoria "Libraries" (Bibliotecas).
  7. Verifique qual "Java Platform" (Plataforma Java) está sendo usada. Ela deve ser uma versão do JDK 1.8 (Java 8) ou superior. Se estiver usando uma versão mais antiga, clique em "Manage Platforms..." ou tente adicionar/mudar para uma versão mais recente do JDK que você tenha instalado.

Após verificar e ajustar as importações e/ou as configurações do projeto:

  1. Salve o arquivo: File -> Save (ou Ctrl + S).
  2. Faça um "Clean and Build Project" (Limpar e Construir Projeto):
    • Vá em Run -> Clean and Build Project.
  3. Execute o projeto: Run -> Run Project (ou F6).

Quase 100% de certeza que o problema será resolvido com uma dessas duas verificações!

Esses são erros de compilação que o NetBeans está reportando. Vamos analisá-los e corrigir um por um.

Erro 1 e 2: error: duplicate class: telas.TelaQuartos e error: duplicate class: telas.TelaReservas

Significado: Este erro significa que você tem duas definições da mesma classe (TelaQuartos ou TelaReservas) no mesmo arquivo .java ou, menos comum, duas arquivos .java com o mesmo nome de classe no mesmo pacote. A linha class TelaQuartos { (na linha 11, por exemplo) está indicando uma segunda declaração de classe.

Causa Comum: No NetBeans, quando você cria um JFrame, ele geralmente gera uma estrutura como esta:

Java
package telas;

// Seus imports

public class TelaQuartos extends javax.swing.JFrame { // Primeira e principal declaração
    // ... conteúdo da classe ...
}
// Se você acidentalmente adicionou outra:
// class TelaQuartos { // <<< ESTA É A DUPLICAÇÃO!
//    // ...
// }

Você provavelmente adicionou, ou o NetBeans gerou acidentalmente, uma segunda declaração de class TelaQuartos { (sem o public e extends javax.swing.JFrame) dentro do mesmo arquivo, ou logo após a declaração principal.

Como Corrigir:

  1. Abra o arquivo TelaQuartos.java na aba "Source" (Código).

  2. Role para a linha 11.

  3. Procure por uma declaração de class TelaQuartos { ... } que esteja duplicada. Deve haver apenas uma declaração de classe principal no arquivo, que é public class TelaQuartos extends javax.swing.JFrame {.

  4. Exclua a declaração de classe duplicada.

  5. Repita o mesmo processo para o arquivo TelaReservas.java:

    • Abra TelaReservas.java na aba "Source".
    • Vá para a linha 11 e procure pela declaração class TelaReservas { ... } duplicada.
    • Exclua a declaração de classe duplicada.

Erro 3: error: cannot find symbol class LocalTime (duas vezes)

Significado: Este erro em TelaCadastro.java na linha 645 significa que o compilador não reconhece a classe LocalTime. Isso acontece porque a classe não foi importada ou, menos provável, o projeto não está configurado para uma versão do Java que a suporta (Java 8 ou superior).

Causa Provável: Você está usando LocalTime.parse(...) na linha 645. Meu método setCurrentDateTimeModern() (que utiliza ZonedDateTime) não usa LocalTime.parse diretamente para a funcionalidade de preenchimento automático. Isso sugere que você pode ter adicionado essa linha por engano ou de outra fonte.

Como Corrigir:

  1. Abra o arquivo TelaCadastro.java na aba "Source".

  2. Primeiro, adicione a importação necessária no topo do arquivo:

    Java
    import java.time.LocalTime; // Adicione esta linha!
    // ... e certifique-se que você já tem as outras importações de java.time:
    // import java.time.LocalDateTime;
    // import java.time.ZoneId;
    // import java.time.ZonedDateTime;
    // import java.time.format.DateTimeFormatter;
    
  3. Agora, verifique o conteúdo da linha 645:

    • Se a linha LocalTime horaAtual = LocalTime.parse(horaAtualStr, formatter); está dentro do método setCurrentDateTimeModern(), e seu objetivo é apenas preencher o campo com a hora atual, você deve remover essa linha. O método setCurrentDateTimeModern() já preenche a hora corretamente usando nowInLuanda.format(timeFormat).
    • O método setCurrentDateTimeModern() que forneci tem esta estrutura (relembrando):
      Java
      private void setCurrentDateTimeModern() {
          ZoneId luandaZone = ZoneId.of("Africa/Luanda");
          ZonedDateTime nowInLuanda = ZonedDateTime.now(luandaZone);
      
          DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("dd/MM/yyyy");
          DateTimeFormatter timeFormat = DateTimeFormatter.ofPattern("HH:mm:ss");
      
          if (jFormattedTextField1 != null) {
              jFormattedTextField1.setText(nowInLuanda.format(dateFormat));
              jFormattedTextField1.setEditable(false);
          }
          if (jFormattedTextField2 != null) { // Este é o campo da hora
              jFormattedTextField2.setText(nowInLuanda.format(timeFormat)); // Esta linha preenche a hora!
              jFormattedTextField2.setEditable(false);
          }
          // Não deve haver LocalTime.parse aqui se o objetivo é apenas preencher a hora atual
      }
      
    • Se você colocou LocalTime.parse em outro lugar com outro objetivo, me diga onde está e o que você quer fazer, e podemos te ajudar a usá-lo corretamente. Mas para preencher a hora automaticamente, essa linha é desnecessária.

Passos Finais (MUITO IMPORTANTES após as correções):

  1. Salve todos os arquivos modificados: TelaQuartos.java, TelaReservas.java, e TelaCadastro.java. (Use File -> Save All ou Ctrl + Shift + S).
  2. No menu superior do NetBeans, vá em Run -> Clean and Build Project. Este passo é crucial para garantir que todas as alterações sejam recompiladas e que nenhum resíduo de compilação antiga esteja causando problemas.
  3. Após a conclusão bem-sucedida do "Clean and Build", execute seu projeto: Run -> Run Project (ou F6).

Com essas correções, seu projeto deve compilar e executar sem os erros de "duplicate class" ou "cannot find symbol LocalTime".

Ok, entendi. Você quer adicionar validações mais robustas ao formulário de TelaCadastroFuncionario.

Atualmente, seu método bnAdicionarActionPerformed já possui uma validação básica para campos vazios. Vamos expandir isso para incluir validações de formato para campos como ID, número de bilhete, telefone, e-mail, data e salário.

Vou adicionar as validações diretamente no método bnAdicionarActionPerformed, explicando cada uma delas.

Considerações importantes antes de começar:

  • Campos de Data: Os campos txtDataNascimentoFunc e txtDataContratacaoFunc são JTextField. Para validação de data, o ideal é usar JFormattedTextField com uma máscara ou um JDatePicker para garantir o formato correto. Para JTextField, a validação será feita por try-catch para converter a String em LocalDate.
  • Campos Numéricos: txtIDFunc e txtSalarioFunc também são JTextField. A validação para números será feita com try-catch para Integer.parseInt() ou Double.parseDouble().
  • E-mail: Validação de e-mail será por RegEx (Expressões Regulares).
  • Telefone e Bilhete: Podemos adicionar validações de comprimento e/ou de formato numérico.

Aqui está o código com as validações adicionadas:

Java
package telas;

import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
import java.util.logging.Level;
import java.util.logging.Logger;

// Importações adicionais para validação
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JButton; // Necessário para bnVoltar.addActionListener(this::bnVoltarActionPerformed);

public class TelaCadatroFuncionario extends javax.swing.JFrame implements java.awt.event.ActionListener
{
    // Adicionado para resolver o erro 'bnVoltar.addActionListener(this::bnVoltarActionPerformed);'
    // A classe deve implementar ActionListener ou você deve criar uma classe anônima
    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
        if (e.getSource() == bnVoltar) {
            bnVoltarActionPerformed(e);
        }
        // Adicione outros botões aqui se eles usarem 'this::methodName' e não tiverem seu próprio listener
    }

    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName());

    public TelaCadatroFuncionario()
    {
        initComponents();
        setLocationRelativeTo(null);
        bnVoltar.addActionListener(this::bnVoltarActionPerformed); // Isso requer 'this' a ser um ActionListener
        // Ou, se bnVoltar já tem um listener gerado pelo NetBeans, remova esta linha.
        // Se você adicionou essa linha manualmente e não tem o método actionPerformed na classe, vai dar erro.
        // Uma forma mais comum (e geralmente gerada pelo NetBeans) é:
        // bnVoltar.addActionListener(new java.awt.event.ActionListener() {
        //     public void actionPerformed(java.awt.event.ActionEvent evt) {
        //         bnVoltarActionPerformed(evt);
        //     }
        // });


        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]
        {
            "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });
    }


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        buttonGroupSexo = new javax.swing.ButtonGroup();
        rbFeminino = new javax.swing.JRadioButton();
        rbMasculino = new javax.swing.JRadioButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalFuncionarios = new javax.swing.JPanel();
        jScrollPaneTabelaFuncionarios = new javax.swing.JScrollPane();
        jTableFuncionarios = new javax.swing.JTable();
        LOGO = new javax.swing.JLabel();
        tITULO = new javax.swing.JLabel();
        lblNomeCompleto = new javax.swing.JLabel();
        lblID = new javax.swing.JLabel();
        lblNumeroBilhete = new javax.swing.JLabel();
        lblDataNascimento = new javax.swing.JLabel();
        lblTelefone = new javax.swing.JLabel();
        lblEmail = new javax.swing.JLabel();
        lblCargoFuncao = new javax.swing.JLabel();
        lblDataContratacao = new javax.swing.JLabel();
        lblSalario = new javax.swing.JLabel();
        lblEndereco = new javax.swing.JLabel();
        lblSexo = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton(); // Este parece ser "Masculino"
        jRadioButton2 = new javax.swing.JRadioButton(); // Este parece ser "Feminino"
        bnAdicionar = new javax.swing.JButton();
        bnAtualizar = new javax.swing.JButton();
        bnExcluir = new javax.swing.JButton();
        txtIDFunc = new javax.swing.JTextField();
        txtNomeCompletoFunc = new javax.swing.JTextField();
        txtNumeroBilheteFunc = new javax.swing.JTextField();
        txtDataNascimentoFunc = new javax.swing.JTextField();
        txtTelefoneFunc = new javax.swing.JTextField();
        txtEmailFunc = new javax.swing.JTextField();
        txtCargoFuncaoFunc = new javax.swing.JTextField();
        txtDataContratacaoFunc = new javax.swing.JTextField();
        txtSalarioFunc = new javax.swing.JTextField();
        txtEnderecoFunc = new javax.swing.JTextField();
        jScrollPaneObservacoesFunc = new javax.swing.JPanel();
        painelObservacoesFunc = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnLimparID = new javax.swing.JButton();
        btnLimparNome = new javax.swing.JButton();
        btnLimparBilhete = new javax.swing.JButton();
        btnLimparNascimento = new javax.swing.JButton();
        btnLimparTelefone = new javax.swing.JButton();
        btnLimparEmail = new javax.swing.JButton();
        btnLimparCargoFuncao = new javax.swing.JButton();
        btnLimparDataContracao = new javax.swing.JButton();
        btnLimparSalario = new javax.swing.JButton();
        btnLimparEndereco = new javax.swing.JButton();
        bnVoltar = new javax.swing.JButton();
        lblObservacoes = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        // É importante que seus JRadioButtons que representam o sexo estejam no mesmo ButtonGroup
        // Adicione esta parte se ainda não estiver no seu initComponents()
        buttonGroupSexo.add(rbFeminino);
        buttonGroupSexo.add(rbMasculino);
        buttonGroupSexo.add(jRadioButton1); // Se este for outro Masculino
        buttonGroupSexo.add(jRadioButton2); // Se este for outro Feminino

        rbFeminino.setText("Feminino");
        rbFeminino.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbFemininoActionPerformed(evt);
            }
        });

        rbMasculino.setText("Masculino");

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jScrollPaneTabelaFuncionarios.setPreferredSize(new java.awt.Dimension(850, 250));

        jTableFuncionarios.setModel(new javax.swing.table.DefaultTableModel(
                new Object [][] {
                        {null, null, null, null, null, null, null, null},
                        {null, null, null, null, null, null, null, null},
                        {null, null, null, null, null, null, null, null},
                        {null, null, null, null, null, null, null, null},
                        {null, null, null, null, null, null, null, null}
                },
                new String [] {
                        "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
                }
        ) {
            Class[] types = new Class [] {
                    java.lang.Object.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        jScrollPaneTabelaFuncionarios.setViewportView(jTableFuncionarios);

        LOGO.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        tITULO.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        tITULO.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        tITULO.setText("Gestão de Funcionários");

        lblNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNomeCompleto.setText("Nome Completo");

        lblID.setFont(new java.awt.Font("Liberation Sans", 0, 18)); // NOI18N
        lblID.setText("Id");

        lblNumeroBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNumeroBilhete.setText("Nº de Bilhete");

        lblDataNascimento.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataNascimento.setText("Data Nasc.:");

        lblTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblTelefone.setText("Telefone");

        lblEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEmail.setText("Email");

        lblCargoFuncao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblCargoFuncao.setText("Cargo/Função");

        lblDataContratacao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataContratacao.setText("Data Contratação");

        lblSalario.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSalario.setText("Salário");

        lblEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEndereco.setText("Endereço");

        lblSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSexo.setText("Sexo");

        jRadioButton1.setText("Masculino");
        // É importante que jRadioButton1 e jRadioButton2 sejam adicionados ao ButtonGroup!
        buttonGroupSexo.add(jRadioButton1); // Certifique-se que o ButtonGroup está declarado e inicializado
        // Se rbMasculino e rbFeminino são os RBs que você está usando, então jRadioButton1 e jRadioButton2 podem ser duplicatas
        // OU, você pode estar usando jRadioButton1 e jRadioButton2, e rbFeminino/rbMasculino são os RBs declarados em cima mas não usados no layout.
        // Precisa verificar qual par de JRadioButtons está realmente no seu layout.
        // Vou assumir que você quer usar 'rbFeminino' e 'rbMasculino' como os principais,
        // mas no seu initComponents você tem 'jRadioButton1' e 'jRadioButton2' com texto.
        // Por favor, revise qual par você quer usar para o sexo e remova o outro para evitar confusão.
        // Se jRadioButton1 e jRadioButton2 são os que estão no design, então use-os no código.
        // POR ENQUANTO, VOU MANTER 'rbFeminino' E 'rbMasculino' NA LÓGICA DO bnAdicionarActionPerformed,
        // E ASSUMO QUE VOCÊ OS ADICIONOU CORRETAMENTE AO SEU buttonGroupSexo.

        jRadioButton2.setText("Feminino");
        buttonGroupSexo.add(jRadioButton2); // Certifique-se que o ButtonGroup está declarado e inicializado

        bnAdicionar.setText("Adicionar");
        bnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAdicionarActionPerformed(evt);
            }
        });


        bnAtualizar.setText("Atualizar");
        bnAtualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAtualizarActionPerformed(evt);
            }
        });

        bnExcluir.setText("Excluir");
        bnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnExcluirActionPerformed(evt);
            }
        });

        txtNomeCompletoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNomeCompletoFuncActionPerformed(evt);
            }
        });

        txtDataContratacaoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataContratacaoFuncActionPerformed(evt);
            }
        });

        txtObservacoes.setColumns(20);
        txtObservacoes.setRows(5);
        painelObservacoesFunc.setViewportView(txtObservacoes);

        javax.swing.GroupLayout jScrollPaneObservacoesFuncLayout = new javax.swing.GroupLayout(jScrollPaneObservacoesFunc);
        jScrollPaneObservacoesFunc.setLayout(jScrollPaneObservacoesFuncLayout);
        jScrollPaneObservacoesFuncLayout.setHorizontalGroup(
                jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jScrollPaneObservacoesFuncLayout.createSequentialGroup()
                                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(17, 17, 17))
        );
        jScrollPaneObservacoesFuncLayout.setVerticalGroup(
                jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.Alignment.TRAILING)
        );

        btnLimparID.setText("Limpar");
        btnLimparID.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparIDActionPerformed(evt);
            }
        });

        btnLimparNome.setText("Limpar");
        btnLimparNome.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNomeActionPerformed(evt);
            }
        });

        btnLimparBilhete.setText("Limpar");
        btnLimparBilhete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparBilheteActionPerformed(evt);
            }
        });

        btnLimparNascimento.setText("Limpar");
        btnLimparNascimento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNascimentoActionPerformed(evt);
            }
        });

        btnLimparTelefone.setText("Limpar");
        btnLimparTelefone.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparTelefoneActionPerformed(evt);
            }
        });

        btnLimparEmail.setText("Limpar");
        btnLimparEmail.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEmailActionPerformed(evt);
            }
        });

        btnLimparCargoFuncao.setText("Limpar");
        btnLimparCargoFuncao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparCargoFuncaoActionPerformed(evt);
            }
        });

        btnLimparDataContracao.setText("Limpar");
        btnLimparDataContracao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparDataContracaoActionPerformed(evt);
            }
        });


        btnLimparSalario.setText("Limpar");
        btnLimparSalario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparSalarioActionPerformed(evt);
            }
        });

        btnLimparEndereco.setText("Limpar");
        btnLimparEndereco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEnderecoActionPerformed(evt);
            }
        });

        bnVoltar.setText("Voltar"); // Este botão tem o listener problemático no construtor.

        lblObservacoes.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblObservacoes.setText("Observações");

        jButton1.setText("Limpar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout painelPrincipalFuncionariosLayout = new javax.swing.GroupLayout(painelPrincipalFuncionarios);
        painelPrincipalFuncionarios.setLayout(painelPrincipalFuncionariosLayout);
        painelPrincipalFuncionariosLayout.setHorizontalGroup(
                painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGap(356, 356, 356)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(lblDataContratacao)
                                        .addComponent(lblSalario)
                                        .addComponent(lblCargoFuncao)
                                        .addComponent(lblEmail)
                                        .addComponent(lblTelefone)
                                        .addComponent(lblDataNascimento)
                                        .addComponent(lblNumeroBilhete)
                                        .addComponent(lblNomeCompleto)
                                        .addComponent(lblID, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(lblEndereco)
                                        .addComponent(lblSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(bnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGap(34, 34, 34)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                                .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 47, Short.MAX_VALUE)
                                                                .addComponent(btnLimparCargoFuncao))
                                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                                .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                                .addComponent(btnLimparEmail))
                                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                                .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                                .addComponent(btnLimparTelefone))
                                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                                .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                                .addComponent(btnLimparNascimento))
                                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                                .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                                .addComponent(btnLimparBilhete))
                                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                                .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                                .addComponent(btnLimparNome))
                                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                                .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                                .addComponent(btnLimparID))
                                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                                                        .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
                                                                        .addComponent(txtSalarioFunc)
                                                                        .addComponent(txtDataContratacaoFunc))
                                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                                        .addComponent(btnLimparDataContracao, javax.swing.GroupLayout.Alignment.TRAILING)
                                                                        .addComponent(btnLimparSalario, javax.swing.GroupLayout.Alignment.TRAILING)
                                                                        .addComponent(btnLimparEndereco, javax.swing.GroupLayout.Alignment.TRAILING)))
                                                        .addComponent(jRadioButton1))
                                                .addGap(0, 0, Short.MAX_VALUE))
                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                                .addGap(58, 58, 58)
                                                                .addComponent(lblObservacoes)
                                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                                                .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE))
                                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                                .addGap(140, 140, 140)
                                                                .addComponent(jRadioButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                                .addComponent(jButton1)
                                                                .addGap(9, 9, 9)))
                                                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                .addGap(373, 373, 373)
                                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                        .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 353, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addComponent(tITULO, javax.swing.GroupLayout.PREFERRED_SIZE, 460, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                .addGap(876, 876, 876)
                                                .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                .addContainerGap(227, Short.MAX_VALUE))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGap(0, 0, Short.MAX_VALUE)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                .addComponent(bnAtualizar)
                                                .addGap(137, 137, 137)
                                                .addComponent(bnAdicionar)
                                                .addGap(323, 323, 323))
                                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                .addComponent(jScrollPaneTabelaFuncionarios, javax.swing.GroupLayout.PREFERRED_SIZE, 1123, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addGap(16, 16, 16))))
        );
        painelPrincipalFuncionariosLayout.setVerticalGroup(
                painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                .addGap(47, 47, 47)
                                                .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                .addGap(83, 83, 83)
                                                .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(tITULO)
                                .addGap(32, 32, 32)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                        .addComponent(btnLimparID)
                                                        .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addComponent(lblID))
                                                .addGap(37, 37, 37)
                                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                        .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addComponent(lblNomeCompleto)))
                                        .addComponent(btnLimparNome, javax.swing.GroupLayout.Alignment.TRAILING))
                                .addGap(18, 18, 18)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(lblNumeroBilhete)
                                        .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(btnLimparBilhete))
                                .addGap(18, 18, 18)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(lblDataNascimento)
                                        .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(btnLimparNascimento))
                                .addGap(28, 28, 28)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(lblTelefone)
                                        .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(btnLimparTelefone))
                                .addGap(26, 26, 26)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(lblEmail)
                                        .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(btnLimparEmail))
                                .addGap(28, 28, 28)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(lblCargoFuncao)
                                        .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(btnLimparCargoFuncao))
                                .addGap(30, 30, 30)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(txtDataContratacaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(btnLimparDataContracao)
                                        .addComponent(lblDataContratacao))
                                .addGap(18, 18, 18)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(btnLimparSalario)
                                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                .addComponent(txtSalarioFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addComponent(lblSalario)))
                                .addGap(25, 25, 25)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addComponent(btnLimparEndereco)
                                        .addComponent(lblEndereco))
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addGap(30, 30, 30))
                                        .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                                .addGap(39, 39, 39)
                                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                                        .addComponent(lblSexo)
                                                        .addComponent(jRadioButton1)
                                                        .addComponent(jRadioButton2)
                                                        .addComponent(jButton1))
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 56, Short.MAX_VALUE)
                                                .addComponent(lblObservacoes)
                                                .addGap(69, 69, 69)))
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(bnAtualizar)
                                        .addComponent(bnExcluir)
                                        .addComponent(bnAdicionar))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jScrollPaneTabelaFuncionarios, javax.swing.GroupLayout.PREFERRED_SIZE, 112, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addContainerGap(166, Short.MAX_VALUE))
        );

        jScrollPane1.setViewportView(painelPrincipalFuncionarios);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1206, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addContainerGap())
        );
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1174, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(111, 111, 111))
        );

        pack();
    }// </editor-fold>

    // Métodos ActionPerformed para os botões de limpar
    private void btnLimparIDActionPerformed(java.awt.event.ActionEvent evt) {
        txtIDFunc.setText("");
    }

    private void btnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        txtNomeCompletoFunc.setText("");
    }

    private void btnLimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        txtNumeroBilheteFunc.setText("");
    }

    private void btnLimparNascimentoActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataNascimentoFunc.setText("");
    }

    private void btnLimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) {
        txtTelefoneFunc.setText("");
    }

    private void btnLimparEmailActionPerformed(java.awt.event.ActionEvent evt) {
        txtEmailFunc.setText("");
    }

    private void btnLimparCargoFuncaoActionPerformed(java.awt.event.ActionEvent evt) {
        txtCargoFuncaoFunc.setText("");
    }

    private void btnLimparDataContracaoActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataContratacaoFunc.setText("");
    }

    private void btnLimparSalarioActionPerformed(java.awt.event.ActionEvent evt) {
        txtSalarioFunc.setText("");
    }

    private void btnLimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
        txtEnderecoFunc.setText("");
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // Este é o botão Limpar para Observações
        txtObservacoes.setText("");
        buttonGroupSexo.clearSelection(); // Limpa a seleção dos RadioButtons de Sexo
    }


    // Método para limpar todos os campos (chamado após adicionar)
    private void limparTodosOsCamposFunc() {
        txtIDFunc.setText("");
        txtNomeCompletoFunc.setText("");
        txtNumeroBilheteFunc.setText("");
        txtDataNascimentoFunc.setText("");
        txtTelefoneFunc.setText("");
        txtEmailFunc.setText("");
        txtCargoFuncaoFunc.setText("");
        txtDataContratacaoFunc.setText("");
        txtSalarioFunc.setText("");
        txtEnderecoFunc.setText("");
        txtObservacoes.setText("");
        if (buttonGroupSexo != null) {
            buttonGroupSexo.clearSelection();
        }
    }


    // Método ActionPerformed para o botão Voltar (se não for gerado pelo NetBeans)
    private void bnVoltarActionPerformed(java.awt.event.ActionEvent evt) {
        // Lógica para voltar, por exemplo, fechar a janela atual e abrir outra
        this.dispose(); // Fecha a janela atual
        // Exemplo:
        // TelaPrincipal telaPrincipal = new TelaPrincipal();
        // telaPrincipal.setVisible(true);
    }


    private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt)
    {
        String idFuncStr = txtIDFunc.getText().trim();
        String nomeCompleto = txtNomeCompletoFunc.getText().trim();
        String numeroBilhete = txtNumeroBilheteFunc.getText().trim();
        String dataNascimentoStr = txtDataNascimentoFunc.getText().trim();
        String telefone = txtTelefoneFunc.getText().trim();
        String email = txtEmailFunc.getText().trim();
        String cargoFuncao = txtCargoFuncaoFunc.getText().trim();
        String dataContratacaoStr = txtDataContratacaoFunc.getText().trim();
        String salarioStr = txtSalarioFunc.getText().trim();
        String endereco = txtEnderecoFunc.getText().trim();

        String sexo = "";
        // Verifique quais RadioButtons você realmente está usando no design para o sexo
        // Pelas declarações no initComponents, você tem 'rbFeminino', 'rbMasculino',
        // E 'jRadioButton1' (Masculino), 'jRadioButton2' (Feminino).
        // É importante que apenas um conjunto seja usado e que eles estejam no 'buttonGroupSexo'.
        // Vou manter a lógica com 'rbFeminino' e 'rbMasculino' como os que você declarou no topo.
        if (rbFeminino.isSelected())
        {
            sexo = "Feminino";
        }
        else if (rbMasculino.isSelected())
        {
            sexo = "Masculino";
        }
        // Se você está usando jRadioButton1 e jRadioButton2 no seu layout:
        // else if (jRadioButton1.isSelected()) {
        //     sexo = "Masculino";
        // } else if (jRadioButton2.isSelected()) {
        //     sexo = "Feminino";
        // }


        String observacoes = txtObservacoes.getText().trim();

        // --- VALIDAÇÕES ---

        // 1. Validação de Campos Obrigatórios (já existente, mas reconfirmada)
        if (idFuncStr.isEmpty() || nomeCompleto.isEmpty() || numeroBilhete.isEmpty() ||
                telefone.isEmpty() || cargoFuncao.isEmpty() || sexo.isEmpty() ||
                dataNascimentoStr.isEmpty() || dataContratacaoStr.isEmpty() || salarioStr.isEmpty())
        {
            JOptionPane.showMessageDialog(this, "Por favor, preencha todos os campos obrigatórios: ID, Nome, Bilhete, Data Nasc., Telefone, Cargo, Data Contrat., Salário e Sexo.", "Campos Obrigatórios", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 2. Validação de ID (numérico e positivo)
        int idFunc;
        try {
            idFunc = Integer.parseInt(idFuncStr);
            if (idFunc <= 0) {
                JOptionPane.showMessageDialog(this, "ID do funcionário deve ser um número positivo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "ID do funcionário inválido. Por favor, insira um número inteiro.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 3. Validação de Número de Bilhete (pode ser alfanumérico, mas geralmente tem um formato específico)
        // Exemplo: 9 dígitos + letras (AA0000000LA000) ou apenas números
        // Vamos validar um formato simples: apenas números e um comprimento razoável (ex: 8 a 15 dígitos)
        // Ou se tiver um formato fixo como XXXXXXXLLX000, adapte o regex.
        if (!numeroBilhete.matches("[0-9A-Za-z]{8,15}")) { // Exemplo: 8 a 15 caracteres alfanuméricos
             JOptionPane.showMessageDialog(this, "Número de Bilhete inválido. Use apenas letras e números (8 a 15 caracteres).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
             return;
        }


        // 4. Validação de Data de Nascimento e Data de Contratação
        // Formato esperado: dd/MM/yyyy
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        LocalDate dataNascimento;
        LocalDate dataContratacao;

        try {
            dataNascimento = LocalDate.parse(dataNascimentoStr, dateFormatter);
            // Opcional: Valide se a data de nascimento não é no futuro e se o funcionário tem uma idade mínima
            if (dataNascimento.isAfter(LocalDate.now().minusYears(18))) { // Funcionário deve ter pelo menos 18 anos
                JOptionPane.showMessageDialog(this, "Funcionário deve ter pelo menos 18 anos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use dd/MM/yyyy.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        try {
            dataContratacao = LocalDate.parse(dataContratacaoStr, dateFormatter);
            // Opcional: Valide se a data de contratação não é no futuro
            if (dataContratacao.isAfter(LocalDate.now())) {
                JOptionPane.showMessageDialog(this, "Data de Contratação não pode ser no futuro.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
            // Opcional: Data de contratação não pode ser antes da data de nascimento (considerando uma idade razoável para contratação)
            if (dataContratacao.isBefore(dataNascimento.plusYears(16))) { // Não pode ser contratado antes dos 16 anos (exemplo)
                JOptionPane.showMessageDialog(this, "Data de Contratação é muito precoce em relação à Data de Nascimento.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }

        } catch (DateTimeParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Contratação inválido. Use dd/MM/yyyy.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 5. Validação de Telefone (apenas números, e comprimento específico, ex: 9 dígitos para Angola)
        if (!telefone.matches("\\d{9}")) { // Valida exatamente 9 dígitos
            JOptionPane.showMessageDialog(this, "Número de Telefone inválido. Deve conter 9 dígitos numéricos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }


        // 6. Validação de Email (formato básico de e-mail)
        String emailRegex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
        Pattern emailPattern = Pattern.compile(emailRegex);
        Matcher emailMatcher = emailPattern.matcher(email);
        if (!email.isEmpty() && !emailMatcher.matches()) { // Se não estiver vazio, deve ser válido
            JOptionPane.showMessageDialog(this, "Formato de Email inválido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }


        // 7. Validação de Salário (numérico, positivo, pode ser double)
        double salario;
        try {
            salario = Double.parseDouble(salarioStr);
            if (salario < 0) { // Salário não pode ser negativo
                JOptionPane.showMessageDialog(this, "Salário não pode ser negativo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Salário inválido. Por favor, insira um valor numérico válido (ex: 150000.50).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }


        // 8. Validação de Sexo (já verificada como obrigatória, mas reconfirmo aqui)
        if (sexo.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Por favor, selecione o sexo do funcionário.", "Campos Obrigatórios", JOptionPane.WARNING_MESSAGE);
            return;
        }


        // Se todas as validações passaram, prossiga com a adição
        JOptionPane.showMessageDialog(this, "Funcionário '" + nomeCompleto + "' adicionado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);

        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.addRow(new Object[]{
                idFunc, nomeCompleto, numeroBilhete, cargoFuncao, telefone, email, salario, dataContratacao
        });

        limparTodosOsCamposFunc();
    }

    private void rbFemininoActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtNomeCompletoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtDataContratacaoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void bnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {
        // Implementar lógica de atualização, que também deve usar validações
        JOptionPane.showMessageDialog(this, "Lógica de Atualização Pendente. As validações também devem ser aplicadas aqui.", "Info", JOptionPane.INFORMATION_MESSAGE);
    }

    private void bnExcluirActionPerformed(java.awt.event.ActionEvent evt) {
        // Implementar lógica de exclusão
        JOptionPane.showMessageDialog(this, "Lógica de Exclusão Pendente.", "Info", JOptionPane.INFORMATION_MESSAGE);
    }


    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    // --- Declaração de variáveis (geradas pelo NetBeans) ---
    private javax.swing.JLabel LOGO;
    private javax.swing.JButton bnAdicionar;
    private javax.swing.JButton bnAtualizar;
    private javax.swing.JButton bnExcluir;
    private javax.swing.JButton bnVoltar;
    private javax.swing.JButton btnLimparBilhete;
    private javax.swing.JButton btnLimparCargoFuncao;
    private javax.swing.JButton btnLimparDataContracao;
    private javax.swing.JButton btnLimparEmail;
    private javax.swing.JButton btnLimparEndereco;
    private javax.swing.JButton btnLimparID;
    private javax.swing.JButton btnLimparNascimento;
    private javax.swing.JButton btnLimparNome;
    private javax.swing.JButton btnLimparSalario;
    private javax.swing.JButton btnLimparTelefone;
    private javax.swing.ButtonGroup buttonGroupSexo; // Certifique-se que este ButtonGroup é usado para os RBs de Sexo
    private javax.swing.JButton jButton1; // Provavelmente o botão limpar para Observações
    private javax.swing.JRadioButton jRadioButton1; // Possivelmente "Masculino"
    private javax.swing.JRadioButton jRadioButton2; // Possivelmente "Feminino"
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPanel jScrollPaneObservacoesFunc;
    private javax.swing.JScrollPane jScrollPaneTabelaFuncionarios;
    private javax.swing.JTable jTableFuncionarios;
    private javax.swing.JLabel lblCargoFuncao;
    private javax.swing.JLabel lblDataContratacao;
    private javax.swing.JLabel lblDataNascimento;
    private javax.swing.JLabel lblEmail;
    private javax.swing.JLabel lblEndereco;
    private javax.swing.JLabel lblID;
    private javax.swing.JLabel lblNomeCompleto;
    private javax.swing.JLabel lblNumeroBilhete;
    private javax.swing.JLabel lblObservacoes;
    private javax.swing.JLabel lblSalario;
    private javax.swing.JLabel lblSexo;
    private javax.swing.JLabel lblTelefone;
    private javax.swing.JPanel painelPrincipalFuncionarios;
    private javax.swing.JScrollPane painelObservacoesFunc;
    private javax.swing.JRadioButton rbFeminino; // O JRadioButton "Feminino"
    private javax.swing.JRadioButton rbMasculino; // O JRadioButton "Masculino"
    private javax.swing.JLabel tITULO;
    private javax.swing.JTextField txtCargoFuncaoFunc;
    private javax.swing.JTextField txtDataContratacaoFunc;
    private javax.swing.JTextField txtDataNascimentoFunc;
    private javax.swing.JTextField txtEmailFunc;
    private javax.swing.JTextField txtEnderecoFunc;
    private javax.swing.JTextField txtIDFunc;
    private javax.swing.JTextField txtNomeCompletoFunc;
    private javax.swing.JTextField txtNumeroBilheteFunc;
    private javax.swing.JTextArea txtObservacoes;
    private javax.swing.JTextField txtSalarioFunc;
    private javax.swing.JTextField txtTelefoneFunc;
    // End of variables declaration//GEN-END:variables
    // </editor-fold>

    // Método main para iniciar a aplicação (gerado pelo NetBeans)
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc="Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TelaCadatroFuncionario().setVisible(true);
            }
        });
    }
}

Pontos importantes e o que você precisa fazer:

  1. Importações: Certifique-se de que todas as importações no topo do arquivo estão presentes:
    Java
    import javax.swing.table.DefaultTableModel;
    import javax.swing.JOptionPane;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import java.time.LocalDate; // NOVO!
    import java.time.format.DateTimeFormatter; // NOVO!
    import java.time.format.DateTimeParseException; // NOVO!
    import java.util.regex.Matcher; // NOVO!
    import java.util.regex.Pattern; // NOVO!
    import javax.swing.JButton; // Se você usa 'this::bnVoltarActionPerformed' e não tem um listener gerado pelo NetBeans
    
  2. bnVoltar.addActionListener(this::bnVoltarActionPerformed);:
    • No seu código original, esta linha está no construtor. Para que this::bnVoltarActionPerformed funcione, sua classe TelaCadatroFuncionario precisa implementar java.awt.event.ActionListener. Adicione implements java.awt.event.ActionListener à declaração da sua classe e o método actionPerformed como adicionei no código acima.
    • Alternativa mais comum (se o NetBeans já gerou o listener): O NetBeans geralmente cria um listener para cada botão automaticamente no initComponents(). Se já existir um bloco assim para bnVoltar (como existe para bnAdicionar, bnAtualizar, bnExcluir), então você deve remover a linha bnVoltar.addActionListener(this::bnVoltarActionPerformed); do construtor.
      • Procure por algo como:
        Java
        bnVoltar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnVoltarActionPerformed(evt);
            }
        });
        
        Se isso já existir no initComponents(), ignore a necessidade de implements ActionListener e a linha do construtor.
  3. RadioButtons de Sexo: Você tem rbFeminino, rbMasculino, jRadioButton1, e jRadioButton2. No initComponents(), jRadioButton1 tem texto "Masculino" e jRadioButton2 tem texto "Feminino". É vital que apenas um par esteja em uso no seu layout e que ambos estejam no buttonGroupSexo. No código de validação, assumi que rbFeminino e rbMasculino são os que você realmente usa. Por favor, verifique no seu design qual par de RadioButtons você está utilizando para "Sexo" e ajuste a lógica no bnAdicionarActionPerformed e as chamadas a buttonGroupSexo.add() no initComponents() de acordo.
  4. Método limparTodosOsCamposFunc(): Adicionei este método para você, que é chamado após uma adição bem-sucedida. Ele limpa todos os campos.
  5. Métodos btnLimpar...ActionPerformed: Preenchi a lógica básica para cada um deles.
  6. bnAtualizarActionPerformed e bnExcluirActionPerformed: Adicionei mensagens básicas. Você deve implementar as lógicas de busca, edição e exclusão de dados aqui. As validações que adicionei em bnAdicionarActionPerformed também devem ser aplicadas (ou reutilizadas) em bnAtualizarActionPerformed.

Para aplicar as mudanças:

  1. Copie e cole as importações adicionais no topo do seu arquivo.
  2. Substitua o conteúdo do seu método bnAdicionarActionPerformed pelo código atualizado fornecido.
  3. Adicione o método limparTodosOsCamposFunc() à sua classe.
  4. Preencha a lógica dos seus botões Limpar (btnLimparIDActionPerformed, etc.) com setText("") para cada campo correspondente.
  5. Revise a parte dos RadioButtons de Sexo (passo 3 das considerações acima) e ajuste conforme seu layout.
  6. Salve o arquivo.
  7. Faça Run -> Clean and Build Project.
  8. Execute (Run -> Run Project ou F6).

Com essas validações, seu formulário estará muito mais robusto contra dados inválidos.

The error "sobrescrita esta a dar erro @Override" (override is giving an error @Override) usually means that the method you are trying to @Override does not correctly match a method in a superclass or implemented interface.

Let's break down the common reasons for this error in the context of actionPerformed:

  1. Incorrect Method Signature: The actionPerformed method must have a very specific signature if you are implementing the ActionListener interface. It must be:

    Java
    public void actionPerformed(java.awt.event.ActionEvent e)
    
    • Check for typos: Ensure actionPerformed, java.awt.event.ActionEvent, and e are spelled exactly as shown.
    • Check parameter type: Make sure the parameter type is java.awt.event.ActionEvent and not something else.
    • Check return type: It must be void.
    • Check access modifier: It must be public.
  2. Missing implements ActionListener: For the @Override annotation to be valid for actionPerformed, the class containing this method must implement the ActionListener interface.

    For example:

    Java
    public class MyClass implements ActionListener { // <--- This is crucial
        // ...
        @Override
        public void actionPerformed(java.awt.event.ActionEvent e) {
            if (e.getSource() == bnVoltar) {
                bnVoltarActionPerformed(e);
            }
        }
        // ...
    }
    

    If your class does not implement ActionListener, the compiler won't find a super method to override, leading to the error.

  3. Inheritance Issue (Less Common for actionPerformed): While less common for actionPerformed (as it's typically from an interface), if you were trying to override a method from a superclass, that method might not exist, might not be visible (e.g., private), or might have a different signature.

How to fix it:

  1. Verify implements ActionListener: Go to the class declaration where this actionPerformed method is located and ensure it explicitly implements ActionListener.

    • If it doesn't, add implements ActionListener to your class declaration.
    • If you just added it, you might also need to import it: import java.awt.event.ActionListener;
  2. Double-check the actionPerformed signature: Compare your code character by character with:

    Java
    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
        // your code
    }
    

Example of a correct setup:

Java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyWindow extends JFrame implements ActionListener { // Class implements ActionListener

    private JButton bnVoltar; // Assuming bnVoltar is a JButton

    public MyWindow() {
        setTitle("Example Window");
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        bnVoltar = new JButton("Voltar");
        bnVoltar.addActionListener(this); // Add the current instance as the listener
        panel.add(bnVoltar);
        add(panel);

        setVisible(true);
    }

    @Override // This annotation is now valid because MyWindow implements ActionListener
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == bnVoltar) {
            bnVoltarActionPerformed(e);
        }
    }

    // This method would contain the logic for when bnVoltar is pressed
    private void bnVoltarActionPerformed(ActionEvent e) {
        System.out.println("Botão Voltar clicado!");
        // Add your specific logic here, e.g., dispose of this window, open another
    }

    public static void main(String[] args) {
        // This ensures the GUI creation is done on the Event Dispatch Thread
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MyWindow();
            }
        });
    }
}

If you can provide more of your code, especially the class declaration where actionPerformed is defined, I can give you a more precise solution!

em portugues

Claro! O erro "sobrescrita está a dar erro @Override" (override is giving an error @Override) significa que o método que você está a tentar sobrescrever (@Override) não corresponde corretamente a um método na superclasse ou interface que está a ser implementada.

Vamos detalhar as razões mais comuns para este erro no contexto de actionPerformed:

  1. Assinatura do Método Incorreta: O método actionPerformed deve ter uma assinatura muito específica se você estiver a implementar a interface ActionListener. Deve ser:

    Java
    public void actionPerformed(java.awt.event.ActionEvent e)
    
    • Verifique erros de digitação: Certifique-se de que actionPerformed, java.awt.event.ActionEvent e e estão escritos exatamente como mostrado.
    • Verifique o tipo do parâmetro: Certifique-se de que o tipo do parâmetro é java.awt.event.ActionEvent e não outro.
    • Verifique o tipo de retorno: Deve ser void (vazio).
    • Verifique o modificador de acesso: Deve ser public.
  2. Falta de implements ActionListener: Para que a anotação @Override seja válida para actionPerformed, a classe que contém este método deve implementar a interface ActionListener.

    Por exemplo:

    Java
    public class MinhaClasse implements ActionListener { // <--- Isto é crucial
        // ...
        @Override
        public void actionPerformed(java.awt.event.ActionEvent e) {
            if (e.getSource() == bnVoltar) {
                bnVoltarActionPerformed(e);
            }
        }
        // ...
    }
    

    Se a sua classe não implementar ActionListener, o compilador não encontrará um método na superclasse ou interface para sobrescrever, resultando no erro.

  3. Problema de Herança (Menos Comum para actionPerformed): Embora menos comum para actionPerformed (já que geralmente vem de uma interface), se estivesse a tentar sobrescrever um método de uma superclasse, esse método pode não existir, pode não ser visível (por exemplo, ser private), ou pode ter uma assinatura diferente.

Como corrigir:

  1. Verifique implements ActionListener: Vá para a declaração da classe onde este método actionPerformed está localizado e certifique-se de que ela implementa explicitamente ActionListener.

    • Se não o fizer, adicione implements ActionListener à declaração da sua classe.
    • Se acabou de o adicionar, pode também precisar de importar: import java.awt.event.ActionListener;
  2. Verifique a assinatura de actionPerformed novamente: Compare o seu código caractere por caractere com:

    Java
    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
        // o seu código
    }
    

Exemplo de uma configuração correta:

Java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MinhaJanela extends JFrame implements ActionListener { // A classe implementa ActionListener

    private JButton bnVoltar; // Assumindo que bnVoltar é um JButton

    public MinhaJanela() {
        setTitle("Janela de Exemplo");
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        bnVoltar = new JButton("Voltar");
        bnVoltar.addActionListener(this); // Adiciona a instância atual como o listener
        panel.add(bnVoltar);
        add(panel);

        setVisible(true);
    }

    @Override // Esta anotação agora é válida porque MinhaJanela implementa ActionListener
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == bnVoltar) {
            bnVoltarActionPerformed(e);
        }
    }

    // Este método conteria a lógica para quando o bnVoltar é clicado
    private void bnVoltarActionPerformed(ActionEvent e) {
        System.out.println("Botão Voltar clicado!");
        // Adicione a sua lógica específica aqui, por exemplo, fechar esta janela, abrir outra
    }

    public static void main(String[] args) {
        // Isto garante que a criação da GUI é feita na Event Dispatch Thread
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MinhaJanela();
            }
        });
    }
}

Se puder fornecer mais do seu código, especialmente a declaração da classe onde actionPerformed está definida, posso dar-lhe uma solução mais precisa!

Got it! You want to implement validations for the input fields in your TelaCadastroFuncionario class. You've already started with a check for empty required fields.

Let's enhance the bnAdicionarActionPerformed method with more specific validations for each field type (numeric, email format, date format, etc.).

Here's the updated bnAdicionarActionPerformed method with comprehensive validations, along with helper methods for validation logic:

Java
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
package telas;

import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.awt.event.ActionListener; // Importar ActionListener

public class TelaCadatroFuncionario extends javax.swing.JFrame implements ActionListener // Adicionar implements ActionListener
{
    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName());

    public TelaCadatroFuncionario()
    {
        initComponents();
        setLocationRelativeTo(null);
        bnVoltar.addActionListener(this::bnVoltarActionPerformed); // Correto para Java 8+ com lambda
        // Se a sua versão Java não suporta lambda (Java 7 ou anterior), use:
        // bnVoltar.addActionListener(new ActionListener() {
        //     @Override
        //     public void actionPerformed(java.awt.event.ActionEvent evt) {
        //         bnVoltarActionPerformed(evt);
        //     }
        // });

        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]
        {
           "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        buttonGroupSexo = new javax.swing.ButtonGroup();
        rbFeminino = new javax.swing.JRadioButton();
        rbMasculino = new javax.swing.JRadioButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalFuncionarios = new javax.swing.JPanel();
        jScrollPaneTabelaFuncionarios = new javax.swing.JScrollPane();
        jTableFuncionarios = new javax.swing.JTable();
        LOGO = new javax.swing.JLabel();
        tITULO = new javax.swing.JLabel();
        lblNomeCompleto = new javax.swing.JLabel();
        lblID = new javax.swing.JLabel();
        lblNumeroBilhete = new javax.swing.JLabel();
        lblDataNascimento = new javax.swing.JLabel();
        lblTelefone = new javax.swing.JLabel();
        lblEmail = new javax.swing.JLabel();
        lblCargoFuncao = new javax.swing.JLabel();
        lblDataContratacao = new javax.swing.JLabel();
        lblSalario = new javax.swing.JLabel();
        lblEndereco = new javax.swing.JLabel();
        lblSexo = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton(); // Este parece ser um duplicado, verificar no design
        jRadioButton2 = new javax.swing.JRadioButton(); // Este parece ser um duplicado, verificar no design
        bnAdicionar = new javax.swing.JButton();
        bnAtualizar = new javax.swing.JButton();
        bnExcluir = new javax.swing.JButton();
        txtIDFunc = new javax.swing.JTextField();
        txtNomeCompletoFunc = new javax.swing.JTextField();
        txtNumeroBilheteFunc = new javax.swing.JTextField();
        txtDataNascimentoFunc = new javax.swing.JTextField();
        txtTelefoneFunc = new javax.swing.JTextField();
        txtEmailFunc = new javax.swing.JTextField();
        txtCargoFuncaoFunc = new javax.swing.JTextField();
        txtDataContratacaoFunc = new javax.swing.JTextField();
        txtSalarioFunc = new javax.swing.JTextField();
        txtEnderecoFunc = new javax.swing.JTextField();
        jScrollPaneObservacoesFunc = new javax.swing.JPanel();
        painelObservacoesFunc = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnLimparID = new javax.swing.JButton();
        btnLimparNome = new javax.swing.JButton();
        btnLimparBilhete = new javax.swing.JButton();
        btnLimparNascimento = new javax.swing.JButton();
        btnLimparTelefone = new javax.swing.JButton();
        btnLimparEmail = new javax.swing.JButton();
        btnLimparCargoFuncao = new javax.swing.JButton();
        btnLimparDataContracao = new javax.swing.JButton();
        btnLimparSalario = new javax.swing.JButton();
        btnLimparEndereco = new javax.swing.JButton();
        bnVoltar = new javax.swing.JButton();
        lblObservacoes = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton(); // Este parece ser um botão para limpar observações

        // Associar os RadioButtons ao ButtonGroup para que apenas um possa ser selecionado
        buttonGroupSexo.add(rbFeminino);
        buttonGroupSexo.add(rbMasculino);
        // Se jRadioButton1 e jRadioButton2 são os que você está usando, adicione-os ao buttonGroupSexo também
        // buttonGroupSexo.add(jRadioButton1);
        // buttonGroupSexo.add(jRadioButton2);

        rbFeminino.setText("Feminino");
        rbFeminino.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbFemininoActionPerformed(evt);
            }
        });

        rbMasculino.setText("Masculino");

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jScrollPaneTabelaFuncionarios.setPreferredSize(new java.awt.Dimension(850, 250));

        jTableFuncionarios.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null}
            },
            new String [] {
                "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Object.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        jScrollPaneTabelaFuncionarios.setViewportView(jTableFuncionarios);

        LOGO.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        tITULO.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        tITULO.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        tITULO.setText("Gestão de Funcionários");

        lblNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNomeCompleto.setText("Nome Completo");

        lblID.setFont(new java.awt.Font("Liberation Sans", 0, 18)); // NOI18N
        lblID.setText("Id");

        lblNumeroBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNumeroBilhete.setText("Nº de Bilhete");

        lblDataNascimento.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataNascimento.setText("Data Nasc.:");

        lblTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblTelefone.setText("Telefone");

        lblEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEmail.setText("Email");

        lblCargoFuncao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblCargoFuncao.setText("Cargo/Função");

        lblDataContratacao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataContratacao.setText("Data Contratação");

        lblSalario.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSalario.setText("Salário");

        lblEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEndereco.setText("Endereço");

        lblSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSexo.setText("Sexo");

        jRadioButton1.setText("Masculino");
        buttonGroupSexo.add(jRadioButton1); // Adicione ao grupo

        jRadioButton2.setText("Feminino");
        buttonGroupSexo.add(jRadioButton2); // Adicione ao grupo

        bnAdicionar.setText("Adicionar");
        bnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAdicionarActionPerformed(evt); // Adiciona o listener para o botão Adicionar
            }
        });


        bnAtualizar.setText("Atualizar");
        bnAtualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAtualizarActionPerformed(evt);
            }
        });

        bnExcluir.setText("Excluir");
        bnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnExcluirActionPerformed(evt);
            }
        });

        txtNomeCompletoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNomeCompletoFuncActionPerformed(evt);
            }
        });

        txtDataContratacaoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataContratacaoFuncActionPerformed(evt);
            }
        });

        txtObservacoes.setColumns(20);
        txtObservacoes.setRows(5);
        painelObservacoesFunc.setViewportView(txtObservacoes);

        javax.swing.GroupLayout jScrollPaneObservacoesFuncLayout = new javax.swing.GroupLayout(jScrollPaneObservacoesFunc);
        jScrollPaneObservacoesFunc.setLayout(jScrollPaneObservacoesFuncLayout);
        jScrollPaneObservacoesFuncLayout.setHorizontalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jScrollPaneObservacoesFuncLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(17, 17, 17))
        );
        jScrollPaneObservacoesFuncLayout.setVerticalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.Alignment.TRAILING)
        );

        btnLimparID.setText("Limpar");
        btnLimparID.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparIDActionPerformed(evt);
            }
        });

        btnLimparNome.setText("Limpar");
        btnLimparNome.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNomeActionPerformed(evt);
            }
        });

        btnLimparBilhete.setText("Limpar");

        btnLimparNascimento.setText("Limpar");

        btnLimparTelefone.setText("Limpar");

        btnLimparEmail.setText("Limpar");

        btnLimparCargoFuncao.setText("Limpar");

        btnLimparDataContracao.setText("Limpar");

        btnLimparSalario.setText("Limpar");

        btnLimparEndereco.setText("Limpar");
        btnLimparEndereco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEnderecoActionPerformed(evt);
            }
        });

        bnVoltar.setText("Voltar");
        // O listener para bnVoltar já foi adicionado no construtor
        // bnVoltar.addActionListener(this::bnVoltarActionPerformed);

        lblObservacoes.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblObservacoes.setText("Observações");

        jButton1.setText("Limpar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout painelPrincipalFuncionariosLayout = new javax.swing.GroupLayout(painelPrincipalFuncionarios);
        painelPrincipalFuncionarios.setLayout(painelPrincipalFuncionariosLayout);
        painelPrincipalFuncionariosLayout.setHorizontalGroup(
            painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGap(356, 356, 356)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblDataContratacao)
                    .addComponent(lblSalario)
                    .addComponent(lblCargoFuncao)
                    .addComponent(lblEmail)
                    .addComponent(lblTelefone)
                    .addComponent(lblDataNascimento)
                    .addComponent(lblNumeroBilhete)
                    .addComponent(lblNomeCompleto)
                    .addComponent(lblID, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblEndereco)
                    .addComponent(lblSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(34, 34, 34)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 47, Short.MAX_VALUE)
                                .addComponent(btnLimparCargoFuncao))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparEmail))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparTelefone))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparNascimento))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparBilhete))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparNome))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparID))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
                                    .addComponent(txtSalarioFunc)
                                    .addComponent(txtDataContratacaoFunc))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(btnLimparDataContracao, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(btnLimparSalario, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(btnLimparEndereco, javax.swing.GroupLayout.Alignment.TRAILING)))
                            .addComponent(jRadioButton1))
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGap(58, 58, 58)
                                .addComponent(lblObservacoes)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGap(140, 140, 140)
                                .addComponent(jRadioButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jButton1)
                                .addGap(9, 9, 9)))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(373, 373, 373)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 353, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(tITULO, javax.swing.GroupLayout.PREFERRED_SIZE, 460, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(876, 876, 876)
                        .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(227, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(bnAtualizar)
                        .addGap(137, 137, 137)
                        .addComponent(bnAdicionar)
                        .addGap(323, 323, 323))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(jScrollPaneTabelaFuncionarios, javax.swing.GroupLayout.PREFERRED_SIZE, 1123, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(16, 16, 16))))
        );
        painelPrincipalFuncionariosLayout.setVerticalGroup(
            painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(47, 47, 47)
                        .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(83, 83, 83)
                        .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tITULO)
                .addGap(32, 32, 32)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnLimparID)
                            .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblID))
                        .addGap(37, 37, 37)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblNomeCompleto)))
                    .addComponent(btnLimparNome, javax.swing.GroupLayout.Alignment.TRAILING))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblNumeroBilhete)
                    .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparBilhete))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblDataNascimento)
                    .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparNascimento))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblTelefone)
                    .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparTelefone))
                .addGap(26, 26, 26)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblEmail)
                    .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparEmail))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblCargoFuncao)
                    .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparCargoFuncao))
                .addGap(30, 30, 30)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtDataContratacaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparDataContracao)
                    .addComponent(lblDataContratacao))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnLimparSalario)
                    .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtSalarioFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblSalario)))
                .addGap(25, 25, 25)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparEndereco)
                    .addComponent(lblEndereco))
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(30, 30, 30))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(39, 39, 39)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lblSexo)
                            .addComponent(jRadioButton1) // Certifique-se de que estes são os RBs corretos
                            .addComponent(jRadioButton2) // Certifique-se de que estes são os RBs corretos
                            .addComponent(jButton1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 56, Short.MAX_VALUE)
                        .addComponent(lblObservacoes)
                        .addGap(69, 69, 69)))
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bnAtualizar)
                    .addComponent(bnExcluir)
                    .addComponent(bnAdicionar))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPaneTabelaFuncionarios, javax.swing.GroupLayout.PREFERRED_SIZE, 112, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(166, Short.MAX_VALUE))
        );

        jScrollPane1.setViewportView(painelPrincipalFuncionarios);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1206, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1174, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(111, 111, 111))
        );

        pack();
    }// </editor-fold>

    private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt)
    {
        String idFunc = txtIDFunc.getText().trim();
        String nomeCompleto = txtNomeCompletoFunc.getText().trim();
        String numeroBilhete = txtNumeroBilheteFunc.getText().trim();
        String dataNascimento = txtDataNascimentoFunc.getText().trim();
        String telefone = txtTelefoneFunc.getText().trim();
        String email = txtEmailFunc.getText().trim();
        String cargoFuncao = txtCargoFuncaoFunc.getText().trim();
        String dataContratacao = txtDataContratacaoFunc.getText().trim();
        String salarioStr = txtSalarioFunc.getText().trim(); // Alterado para String para validação
        String endereco = txtEnderecoFunc.getText().trim();

        String sexo = "";
        // Assumindo que jRadioButton1 é Masculino e jRadioButton2 é Feminino,
        // ou use rbMasculino e rbFeminino se esses são os seus RBs no design
        if (jRadioButton2.isSelected()) { // Se for Feminino
            sexo = "Feminino";
        } else if (jRadioButton1.isSelected()) { // Se for Masculino
            sexo = "Masculino";
        } else if (rbFeminino.isSelected()) { // Caso você esteja usando rbFeminino e rbMasculino
            sexo = "Feminino";
        } else if (rbMasculino.isSelected()) { // Caso você esteja usando rbFeminino e rbMasculino
            sexo = "Masculino";
        }

        String observacoes = txtObservacoes.getText().trim();

        // --- VALIDAÇÕES ---

        // 1. Campos Obrigatórios
        if (idFunc.isEmpty() || nomeCompleto.isEmpty() || numeroBilhete.isEmpty() ||
            telefone.isEmpty() || cargoFuncao.isEmpty() || sexo.isEmpty())
        {
            JOptionPane.showMessageDialog(this, "Por favor, preencha todos os campos obrigatórios: ID, Nome Completo, Nº de Bilhete, Telefone, Cargo/Função e Sexo.", "Campos Obrigatórios", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 2. Validação de ID (apenas números)
        if (!idFunc.matches("\\d+")) {
            JOptionPane.showMessageDialog(this, "O campo 'ID' deve conter apenas números.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 3. Validação de Nº de Bilhete (formato específico, ex: "000000000LA000")
        // Este é um exemplo para o formato angolano. Adapte conforme necessário.
        if (!numeroBilhete.matches("\\d{9}[A-Z]{2}\\d{3}")) {
            JOptionPane.showMessageDialog(this, "O campo 'Nº de Bilhete' deve seguir o formato XXXXXXXXXLLYYY (X=número, L=letra, Y=número). Ex: 001234567LA001", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 4. Validação de Data de Nascimento (formato dd/MM/yyyy)
        if (!dataNascimento.isEmpty() && !isValidDate(dataNascimento, "dd/MM/yyyy")) {
            JOptionPane.showMessageDialog(this, "O campo 'Data de Nascimento' deve estar no formato DD/MM/AAAA. Ex: 25/05/1990", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 5. Validação de Telefone (apenas números, 9 dígitos para Angola)
        if (!telefone.matches("\\d{9}")) {
            JOptionPane.showMessageDialog(this, "O campo 'Telefone' deve conter exatamente 9 dígitos numéricos. Ex: 9XXXXXXXX", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 6. Validação de Email (formato de email básico)
        if (!email.isEmpty() && !isValidEmail(email)) {
            JOptionPane.showMessageDialog(this, "Por favor, insira um 'Email' válido. Ex: exemplo@dominio.com", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 7. Validação de Data de Contratação (formato dd/MM/yyyy)
        if (!dataContratacao.isEmpty() && !isValidDate(dataContratacao, "dd/MM/yyyy")) {
            JOptionPane.showMessageDialog(this, "O campo 'Data de Contratação' deve estar no formato DD/MM/AAAA. Ex: 01/01/2020", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 8. Validação de Salário (apenas números ou decimais)
        double salario = 0.0;
        if (!salarioStr.isEmpty()) {
            try {
                salario = Double.parseDouble(salarioStr.replace(",", ".")); // Lida com vírgula como separador decimal
                if (salario < 0) {
                     JOptionPane.showMessageDialog(this, "O 'Salário' não pode ser negativo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                     return;
                }
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(this, "O campo 'Salário' deve conter um valor numérico válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
        }

        // Se todas as validações passaram
        JOptionPane.showMessageDialog(this, "Funcionário '" + nomeCompleto + "' adicionado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);

        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.addRow(new Object[]{
            idFunc, nomeCompleto, numeroBilhete, cargoFuncao, telefone, email, salario, dataContratacao
        });

        limparTodosOsCamposFunc();
    }

    // --- Métodos Auxiliares de Validação ---

    private boolean isValidDate(String dateStr, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        sdf.setLenient(false); // Impede datas inválidas como "31/02/2023"
        try {
            sdf.parse(dateStr);
            return true;
        } catch (ParseException e) {
            return false;
        }
    }

    private boolean isValidEmail(String email) {
        // Regex mais robusta para validação de email
        String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
        Pattern pattern = Pattern.compile(emailRegex);
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }

    // --- Seus outros métodos (manter como estão) ---

    private void rbFemininoActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void bnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {
        // Lógica de atualização
    }

    private void bnExcluirActionPerformed(java.awt.event.ActionEvent evt) {
        // Lógica de exclusão
    }

    private void txtNomeCompletoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtDataContratacaoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void btnLimparIDActionPerformed(java.awt.event.ActionEvent evt) {
        txtIDFunc.setText("");
    }

    private void btnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        txtNomeCompletoFunc.setText("");
    }

    private void btnLimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
        txtEnderecoFunc.setText("");
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        txtObservacoes.setText(""); // Limpa o campo de observações
    }

    // Implementação do método actionPerformed da interface ActionListener
    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
        if (e.getSource() == bnVoltar) {
            bnVoltarActionPerformed(e);
        }
        // Se houver outros ActionListeners genéricos na classe, adicione-os aqui
    }


    private void bnVoltarActionPerformed(java.awt.event.ActionEvent e) {
        // Lógica para o botão Voltar
        // Por exemplo, para fechar esta janela:
        this.dispose();
        // E talvez abrir a tela anterior, se houver:
        // new TelaPrincipal().setVisible(true);
    }

    // Método para limpar todos os campos da tela
    private void limparTodosOsCamposFunc() {
        txtIDFunc.setText("");
        txtNomeCompletoFunc.setText("");
        txtNumeroBilheteFunc.setText("");
        txtDataNascimentoFunc.setText("");
        txtTelefoneFunc.setText("");
        txtEmailFunc.setText("");
        txtCargoFuncaoFunc.setText("");
        txtDataContratacaoFunc.setText("");
        txtSalarioFunc.setText("");
        txtEnderecoFunc.setText("");
        txtObservacoes.setText("");
        buttonGroupSexo.clearSelection(); // Limpa a seleção dos radio buttons de sexo
    }


    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TelaCadatroFuncionario().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel LOGO;
    private javax.swing.JButton bnAdicionar;
    private javax.swing.JButton bnAtualizar;
    private javax.swing.JButton bnExcluir;
    private javax.swing.JButton bnVoltar;
    private javax.swing.JButton btnLimparBilhete;
    private javax.swing.JButton btnLimparCargoFuncao;
    private javax.swing.JButton btnLimparDataContracao;
    private javax.swing.JButton btnLimparEmail;
    private javax.swing.JButton btnLimparEndereco;
    private javax.swing.JButton btnLimparID;
    private javax.swing.JButton btnLimparNascimento;
    private javax.swing.JButton btnLimparNome;
    private javax.swing.JButton btnLimparSalario;
    private javax.swing.JButton btnLimparTelefone;
    private javax.swing.ButtonGroup buttonGroupSexo;
    private javax.swing.JButton jButton1;
    private javax.swing.JRadioButton jRadioButton1;
    private javax.swing.JRadioButton jRadioButton2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPanel jScrollPaneObservacoesFunc;
    private javax.swing.JScrollPane jScrollPaneTabelaFuncionarios;
    private javax.swing.JTable jTableFuncionarios;
    private javax.swing.JLabel lblCargoFuncao;
    private javax.swing.JLabel lblDataContratacao;
    private javax.swing.JLabel lblDataNascimento;
    private javax.swing.JLabel lblEmail;
    private javax.swing.JLabel lblEndereco;
    private javax.swing.JLabel lblID;
    private javax.swing.JLabel lblNomeCompleto;
    private javax.swing.JLabel lblNumeroBilhete;
    private javax.swing.JLabel lblObservacoes;
    private javax.swing.JLabel lblSalario;
    private javax.swing.JLabel lblSexo;
    private javax.swing.JLabel lblTelefone;
    private javax.swing.JPanel painelPrincipalFuncionarios;
    private javax.swing.JScrollPane painelObservacoesFunc;
    private javax.swing.JRadioButton rbFeminino;
    private javax.swing.JRadioButton rbMasculino;
    private javax.swing.JLabel tITULO;
    private javax.swing.JTextField txtCargoFuncaoFunc;
    private javax.swing.JTextField txtDataContratacaoFunc;
    private javax.swing.JTextField txtDataNascimentoFunc;
    private javax.swing.JTextField txtEmailFunc;
    private javax.swing.JTextField txtEnderecoFunc;
    private javax.swing.JTextField txtIDFunc;
    private javax.swing.JTextField txtNomeCompletoFunc;
    private javax.swing.JTextField txtNumeroBilheteFunc;
    private javax.swing.JTextArea txtObservacoes;
    private javax.swing.JTextField txtSalarioFunc;
    private javax.swing.JTextField txtTelefoneFunc;
    // End of variables declaration
}

Principais alterações e adições:

  1. Importação de ActionListener:

    Java
    import java.awt.event.ActionListener;
    

    Isso é necessário porque a classe TelaCadatroFuncionario precisa implementar a interface ActionListener para que o @Override no actionPerformed funcione corretamente.

  2. implements ActionListener na Declaração da Classe:

    Java
    public class TelaCadatroFuncionario extends javax.swing.JFrame implements ActionListener
    

    Isso corrige o problema de sobrescrita que você mencionou anteriormente.

  3. Método actionPerformed:

    Java
    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
        if (e.getSource() == bnVoltar) {
            bnVoltarActionPerformed(e);
        }
        // Se houver outros ActionListeners genéricos na classe, adicione-os aqui
    }
    

    Este é o método obrigatório da interface ActionListener. Ele encaminha o evento do botão bnVoltar para o seu método bnVoltarActionPerformed.

  4. Validações Adicionais em bnAdicionarActionPerformed:

    • .trim() nos campos: Adicionado .trim() para remover espaços em branco no início e no final das strings, evitando que campos com apenas espaços sejam considerados preenchidos.
    • Validação de ID: Usa idFunc.matches("\\d+") para garantir que o ID contenha apenas dígitos.
    • Validação de Nº de Bilhete: Usei uma expressão regular \\d{9}[A-Z]{2}\\d{3} como exemplo para o formato de bilhete de identidade angolano (9 dígitos, 2 letras maiúsculas, 3 dígitos). Ajuste esta regex se o formato do BI for diferente.
    • Validação de Data (isValidDate):
      • Um novo método isValidDate(String dateStr, String format) foi criado.
      • Ele usa SimpleDateFormat e setLenient(false) para garantir que a data esteja no formato correto (DD/MM/AAAA) e seja uma data válida (ex: não aceita 31/02/2023).
    • Validação de Telefone: Usa telefone.matches("\\d{9}") para garantir 9 dígitos numéricos.
    • Validação de Email (isValidEmail):
      • Um novo método isValidEmail(String email) foi criado.
      • Ele usa uma expressão regular mais robusta para verificar o formato básico de um e-mail.
    • Validação de Salário:
      • Converte o salarioStr para double usando Double.parseDouble().
      • Inclui um .replace(",", ".") para aceitar vírgulas como separador decimal (comum em português).
      • Captura NumberFormatException caso o valor não seja numérico.
      • Adiciona validação para garantir que o salário não seja negativo.
    • Mensagens de erro específicas: Cada validação tem uma JOptionPane.showMessageDialog com uma mensagem clara sobre o erro.
  5. buttonGroupSexo:

    • Certifique-se de que jRadioButton1 (Masculino) e jRadioButton2 (Feminino) estão adicionados ao buttonGroupSexo no seu initComponents(). Isso garante que apenas um possa ser selecionado por vez. Eu adicionei as linhas para isso. Se você estiver usando rbFeminino e rbMasculino definidos no topo do seu código (linhas 45-46), certifique-se de que eles são os que estão no design e use-os nas condições de if (rbFeminino.isSelected()).
  6. Limpar Campos:

    • Adicionado um método limparTodosOsCamposFunc() para redefinir todos os campos após a adição bem-sucedida.
    • Adicionado buttonGroupSexo.clearSelection(); para desmarcar os radio buttons.

Agora, quando o botão "Adicionar" for clicado, ele passará por todas essas validações antes de adicionar os dados à tabela. Se alguma validação falhar, uma mensagem de erro será exibida e o processo de adição será interrompido.

ActionListener isso esta onde ?

Ah, boa pergunta! A ActionListener está em duas partes principais no seu código, e eu a adicionei/referenciei para corrigir o erro @Override e para que a sua classe possa "escutar" eventos de botões.

Vamos detalhar onde ela está:

  1. Na declaração da sua classe (implements ActionListener): Esta linha indica que a sua classe TelaCadatroFuncionario vai "implementar" (ou seja, fornecer uma implementação para) os métodos definidos na interface ActionListener.

    Java
    public class TelaCadatroFuncionario extends javax.swing.JFrame implements ActionListener
    

    Eu adicionei implements ActionListener nesta linha, que é a declaração da sua classe.

  2. No método actionPerformed(java.awt.event.ActionEvent e): Este é o método principal da interface ActionListener. Qualquer componente (como um JButton) que tiver um ActionListener associado a ele chamará este método quando um evento de ação ocorrer (por exemplo, quando o botão for clicado).

    Você verá que eu adicionei este método ao seu código:

    Java
    @Override // <--- Esta anotação indica que você está sobrescrevendo um método da interface
    public void actionPerformed(java.awt.event.ActionEvent e) {
        if (e.getSource() == bnVoltar) {
            bnVoltarActionPerformed(e);
        }
        // Se houver outros ActionListeners genéricos na classe, adicione-os aqui
    }
    

    Este método actionPerformed é o "ouvinte" que o Java Swing espera que sua classe tenha, uma vez que ela declara implements ActionListener. Ele é quem recebe os eventos e decide o que fazer com eles.

Por que eu adicionei isso?

No seu código original, você tinha esta linha no construtor:

Java
bnVoltar.addActionListener(this::bnVoltarActionPerformed);

Esta é uma forma moderna (Java 8+) de adicionar um ActionListener usando uma "referência de método". Para que essa linha funcione sem um erro de compilação, o compilador precisa saber que this (a sua instância de TelaCadatroFuncionario) é capaz de ser um ActionListener. Ao adicionar implements ActionListener à declaração da classe e fornecer o método actionPerformed (mesmo que ele apenas chame outro método, como bnVoltarActionPerformed), você satisfaz essa exigência.

Resumindo, a ActionListener é uma interface que define um contrato (a necessidade de ter um método actionPerformed). Ao implementar essa interface, sua classe concorda em seguir esse contrato, permitindo que ela seja usada como um ouvinte para eventos de ação em componentes Swing.

em queros em isso

Ainda estou com algumas dúvidas sobre o que você quer dizer com "em queros em isso".

Você pode especificar um pouco mais? Por exemplo:

  1. Você quer saber onde esses arquivos estão no seu computador?
  2. Você quer saber como usar esses arquivos no seu código Java (especificamente as imagens)?
  3. Você quer saber se as validações que fizemos se aplicam a esses arquivos? (O que não seria o caso, pois os arquivos de imagem são recursos visuais, não dados para validação de formulário).
  4. Você está se referindo a algo completamente diferente?

Por favor, explique o que você "quer" e "onde" para que eu possa te ajudar melhor.

naoq iero usar o implementesion

Ok, entendi! Você não quer usar implements ActionListener na sua classe TelaCadatroFuncionario.

Isso é perfeitamente possível! Em vez de fazer a classe inteira ser um ActionListener, podemos criar um ActionListener anônimo ou uma expressão lambda (se estiver usando Java 8 ou superior) diretamente no local onde você adiciona o listener ao botão.

Aqui está como você pode fazer isso para cada botão que precisa de um ActionListener, sem que sua classe precise implementar a interface:

1. Remover implements ActionListener: Altere a declaração da sua classe de:

Java
public class TelaCadatroFuncionario extends javax.swing.JFrame implements ActionListener

Para:

Java
public class TelaCadatroFuncionario extends javax.swing.JFrame

2. Alterar a forma como os ActionListeners são adicionados (principalmente no initComponents() e no construtor):

Vou mostrar como ficaria o seu initComponents() e o construtor, focando apenas nas linhas relevantes para os listeners.

Java
package telas;

import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// Não precisa mais importar java.awt.event.ActionListener se não for usar implements

public class TelaCadatroFuncionario extends javax.swing.JFrame // Removido 'implements ActionListener'
{
    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName());

    public TelaCadatroFuncionario()
    {
        initComponents();
        setLocationRelativeTo(null);

        // Adicionando listener para bnVoltar (usando lambda - Java 8+)
        bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
        // Se estiver usando Java 7 ou anterior, use a classe anônima:
        // bnVoltar.addActionListener(new java.awt.event.ActionListener() {
        //     public void actionPerformed(java.awt.event.ActionEvent evt) {
        //         bnVoltarActionPerformed(evt);
        //     }
        // });

        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]
        {
           "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        buttonGroupSexo = new javax.swing.ButtonGroup();
        rbFeminino = new javax.swing.JRadioButton();
        rbMasculino = new javax.swing.JRadioButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalFuncionarios = new javax.swing.JPanel();
        jScrollPaneTabelaFuncionarios = new javax.swing.JScrollPane();
        jTableFuncionarios = new javax.swing.JTable();
        LOGO = new javax.swing.JLabel();
        tITULO = new javax.swing.JLabel();
        lblNomeCompleto = new javax.swing.JLabel();
        lblID = new javax.swing.JLabel();
        lblNumeroBilhete = new javax.swing.JLabel();
        lblDataNascimento = new javax.swing.JLabel();
        lblTelefone = new javax.swing.JLabel();
        lblEmail = new javax.swing.JLabel();
        lblCargoFuncao = new javax.swing.JLabel();
        lblDataContratacao = new javax.swing.JLabel();
        lblSalario = new javax.swing.JLabel();
        lblEndereco = new javax.swing.JLabel();
        lblSexo = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        bnAdicionar = new javax.swing.JButton();
        bnAtualizar = new javax.swing.JButton();
        bnExcluir = new javax.swing.JButton();
        txtIDFunc = new javax.swing.JTextField();
        txtNomeCompletoFunc = new javax.swing.JTextField();
        txtNumeroBilheteFunc = new javax.swing.JTextField();
        txtDataNascimentoFunc = new javax.swing.JTextField();
        txtTelefoneFunc = new javax.swing.JTextField();
        txtEmailFunc = new javax.swing.JTextField();
        txtCargoFuncaoFunc = new javax.swing.JTextField();
        txtDataContratacaoFunc = new javax.swing.JTextField();
        txtSalarioFunc = new javax.swing.JTextField();
        txtEnderecoFunc = new javax.swing.JTextField();
        jScrollPaneObservacoesFunc = new javax.swing.JPanel();
        painelObservacoesFunc = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnLimparID = new javax.swing.JButton();
        btnLimparNome = new javax.swing.JButton();
        btnLimparBilhete = new javax.swing.JButton();
        btnLimparNascimento = new javax.swing.JButton();
        btnLimparTelefone = new javax.swing.JButton();
        btnLimparEmail = new javax.swing.JButton();
        btnLimparCargoFuncao = new javax.swing.JButton();
        btnLimparDataContracao = new javax.swing.JButton();
        btnLimparSalario = new javax.swing.JButton();
        btnLimparEndereco = new javax.swing.JButton();
        bnVoltar = new javax.swing.JButton();
        lblObservacoes = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        // Associar os RadioButtons ao ButtonGroup para que apenas um possa ser selecionado
        buttonGroupSexo.add(rbFeminino);
        buttonGroupSexo.add(rbMasculino);
        buttonGroupSexo.add(jRadioButton1); // Certifique-se de que jRadioButton1 e jRadioButton2 são os que você usa
        buttonGroupSexo.add(jRadioButton2);

        rbFeminino.setText("Feminino");
        rbFeminino.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbFemininoActionPerformed(evt);
            }
        });

        rbMasculino.setText("Masculino");

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jScrollPaneTabelaFuncionarios.setPreferredSize(new java.awt.Dimension(850, 250));

        jTableFuncionarios.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null}
            },
            new String [] {
                "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Object.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        jScrollPaneTabelaFuncionarios.setViewportView(jTableFuncionarios);

        LOGO.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        tITULO.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        tITULO.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        tITULO.setText("Gestão de Funcionários");

        lblNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNomeCompleto.setText("Nome Completo");

        lblID.setFont(new java.awt.Font("Liberation Sans", 0, 18)); // NOI18N
        lblID.setText("Id");

        lblNumeroBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNumeroBilhete.setText("Nº de Bilhete");

        lblDataNascimento.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataNascimento.setText("Data Nasc.:");

        lblTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblTelefone.setText("Telefone");

        lblEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEmail.setText("Email");

        lblCargoFuncao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblCargoFuncao.setText("Cargo/Função");

        lblDataContratacao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataContratacao.setText("Data Contratação");

        lblSalario.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSalario.setText("Salário");

        lblEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEndereco.setText("Endereço");

        lblSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSexo.setText("Sexo");

        jRadioButton1.setText("Masculino");

        jRadioButton2.setText("Feminino");

        bnAdicionar.setText("Adicionar");
        // Listener para bnAdicionar
        bnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAdicionarActionPerformed(evt);
            }
        });


        bnAtualizar.setText("Atualizar");
        // Listener para bnAtualizar
        bnAtualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAtualizarActionPerformed(evt);
            }
        });

        bnExcluir.setText("Excluir");
        // Listener para bnExcluir
        bnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnExcluirActionPerformed(evt);
            }
        });

        txtNomeCompletoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNomeCompletoFuncActionPerformed(evt);
            }
        });

        txtDataContratacaoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataContratacaoFuncActionPerformed(evt);
            }
        });

        txtObservacoes.setColumns(20);
        txtObservacoes.setRows(5);
        painelObservacoesFunc.setViewportView(txtObservacoes);

        javax.swing.GroupLayout jScrollPaneObservacoesFuncLayout = new javax.swing.GroupLayout(jScrollPaneObservacoesFunc);
        jScrollPaneObservacoesFunc.setLayout(jScrollPaneObservacoesFuncLayout);
        jScrollPaneObservacoesFuncLayout.setHorizontalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jScrollPaneObservacoesFuncLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(17, 17, 17))
        );
        jScrollPaneObservacoesFuncLayout.setVerticalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.Alignment.TRAILING)
        );

        btnLimparID.setText("Limpar");
        btnLimparID.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparIDActionPerformed(evt);
            }
        });

        btnLimparNome.setText("Limpar");
        btnLimparNome.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNomeActionPerformed(evt);
            }
        });

        btnLimparBilhete.setText("Limpar");
        btnLimparBilhete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparBilheteActionPerformed(evt); // Adicionei listener para este também
            }
        });


        btnLimparNascimento.setText("Limpar");
        btnLimparNascimento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNascimentoActionPerformed(evt); // Adicionei listener para este também
            }
        });

        btnLimparTelefone.setText("Limpar");
        btnLimparTelefone.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparTelefoneActionPerformed(evt); // Adicionei listener para este também
            }
        });


        btnLimparEmail.setText("Limpar");
        btnLimparEmail.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEmailActionPerformed(evt); // Adicionei listener para este também
            }
        });

        btnLimparCargoFuncao.setText("Limpar");
        btnLimparCargoFuncao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparCargoFuncaoActionPerformed(evt); // Adicionei listener para este também
            }
        });

        btnLimparDataContracao.setText("Limpar");
        btnLimparDataContracao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparDataContracaoActionPerformed(evt); // Adicionei listener para este também
            }
        });

        btnLimparSalario.setText("Limpar");
        btnLimparSalario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparSalarioActionPerformed(evt); // Adicionei listener para este também
            }
        });

        btnLimparEndereco.setText("Limpar");
        btnLimparEndereco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEnderecoActionPerformed(evt);
            }
        });

        bnVoltar.setText("Voltar");
        // Listener para bnVoltar já está no construtor

        lblObservacoes.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblObservacoes.setText("Observações");

        jButton1.setText("Limpar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout painelPrincipalFuncionariosLayout = new javax.swing.GroupLayout(painelPrincipalFuncionarios);
        painelPrincipalFuncionarios.setLayout(painelPrincipalFuncionariosLayout);
        painelPrincipalFuncionariosLayout.setHorizontalGroup(
            painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGap(356, 356, 356)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblDataContratacao)
                    .addComponent(lblSalario)
                    .addComponent(lblCargoFuncao)
                    .addComponent(lblEmail)
                    .addComponent(lblTelefone)
                    .addComponent(lblDataNascimento)
                    .addComponent(lblNumeroBilhete)
                    .addComponent(lblNomeCompleto)
                    .addComponent(lblID, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblEndereco)
                    .addComponent(lblSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(34, 34, 34)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 47, Short.MAX_VALUE)
                                .addComponent(btnLimparCargoFuncao))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparEmail))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparTelefone))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparNascimento))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparBilhete))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparNome))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparID))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
                                    .addComponent(txtSalarioFunc)
                                    .addComponent(txtDataContratacaoFunc))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(btnLimparDataContracao, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(btnLimparSalario, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(btnLimparEndereco, javax.swing.GroupLayout.Alignment.TRAILING)))
                            .addComponent(jRadioButton1))
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGap(58, 58, 58)
                                .addComponent(lblObservacoes)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGap(140, 140, 140)
                                .addComponent(jRadioButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jButton1)
                                .addGap(9, 9, 9)))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(373, 373, 373)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 353, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(tITULO, javax.swing.GroupLayout.PREFERRED_SIZE, 460, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(876, 876, 876)
                        .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(227, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(bnAtualizar)
                        .addGap(137, 137, 137)
                        .addComponent(bnAdicionar)
                        .addGap(323, 323, 323))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(jScrollPaneTabelaFuncionarios, javax.swing.GroupLayout.PREFERRED_SIZE, 1123, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(16, 16, 16))))
        );
        painelPrincipalFuncionariosLayout.setVerticalGroup(
            painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(47, 47, 47)
                        .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(83, 83, 83)
                        .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tITULO)
                .addGap(32, 32, 32)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnLimparID)
                            .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblID))
                        .addGap(37, 37, 37)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblNomeCompleto)))
                    .addComponent(btnLimparNome, javax.swing.GroupLayout.Alignment.TRAILING))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblNumeroBilhete)
                    .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparBilhete))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblDataNascimento)
                    .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparNascimento))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblTelefone)
                    .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparTelefone))
                .addGap(26, 26, 26)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblEmail)
                    .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparEmail))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblCargoFuncao)
                    .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparCargoFuncao))
                .addGap(30, 30, 30)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtDataContratacaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparDataContracao)
                    .addComponent(lblDataContratacao))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnLimparSalario)
                    .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtSalarioFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblSalario)))
                .addGap(25, 25, 25)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparEndereco)
                    .addComponent(lblEndereco))
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(30, 30, 30))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(39, 39, 39)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lblSexo)
                            .addComponent(jRadioButton1)
                            .addComponent(jRadioButton2)
                            .addComponent(jButton1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 56, Short.MAX_VALUE)
                        .addComponent(lblObservacoes)
                        .addGap(69, 69, 69)))
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bnAtualizar)
                    .addComponent(bnExcluir)
                    .addComponent(bnAdicionar))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPaneTabelaFuncionarios, javax.swing.GroupLayout.PREFERRED_SIZE, 112, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(166, Short.MAX_VALUE))
        );

        jScrollPane1.setViewportView(painelPrincipalFuncionarios);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1206, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1174, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(111, 111, 111))
        );

        pack();
    }// </editor-fold>

    private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt)
    {
        String idFunc = txtIDFunc.getText().trim();
        String nomeCompleto = txtNomeCompletoFunc.getText().trim();
        String numeroBilhete = txtNumeroBilheteFunc.getText().trim();
        String dataNascimento = txtDataNascimentoFunc.getText().trim();
        String telefone = txtTelefoneFunc.getText().trim();
        String email = txtEmailFunc.getText().trim();
        String cargoFuncao = txtCargoFuncaoFunc.getText().trim();
        String dataContratacao = txtDataContratacaoFunc.getText().trim();
        String salarioStr = txtSalarioFunc.getText().trim();
        String endereco = txtEnderecoFunc.getText().trim();

        String sexo = "";
        if (jRadioButton2.isSelected()) {
            sexo = "Feminino";
        } else if (jRadioButton1.isSelected()) {
            sexo = "Masculino";
        } else if (rbFeminino.isSelected()) {
            sexo = "Feminino";
        } else if (rbMasculino.isSelected()) {
            sexo = "Masculino";
        }

        String observacoes = txtObservacoes.getText().trim();

        // --- VALIDAÇÕES ---

        // 1. Campos Obrigatórios
        if (idFunc.isEmpty() || nomeCompleto.isEmpty() || numeroBilhete.isEmpty() ||
            telefone.isEmpty() || cargoFuncao.isEmpty() || sexo.isEmpty())
        {
            JOptionPane.showMessageDialog(this, "Por favor, preencha todos os campos obrigatórios: ID, Nome Completo, Nº de Bilhete, Telefone, Cargo/Função e Sexo.", "Campos Obrigatórios", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 2. Validação de ID (apenas números)
        if (!idFunc.matches("\\d+")) {
            JOptionPane.showMessageDialog(this, "O campo 'ID' deve conter apenas números.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 3. Validação de Nº de Bilhete (formato específico, ex: "000000000LA000")
        if (!numeroBilhete.matches("\\d{9}[A-Z]{2}\\d{3}")) {
            JOptionPane.showMessageDialog(this, "O campo 'Nº de Bilhete' deve seguir o formato XXXXXXXXXLLYYY (X=número, L=letra, Y=número). Ex: 001234567LA001", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 4. Validação de Data de Nascimento (formato dd/MM/yyyy)
        if (!dataNascimento.isEmpty() && !isValidDate(dataNascimento, "dd/MM/yyyy")) {
            JOptionPane.showMessageDialog(this, "O campo 'Data de Nascimento' deve estar no formato DD/MM/AAAA. Ex: 25/05/1990", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 5. Validação de Telefone (apenas números, 9 dígitos para Angola)
        if (!telefone.matches("\\d{9}")) {
            JOptionPane.showMessageDialog(this, "O campo 'Telefone' deve conter exatamente 9 dígitos numéricos. Ex: 9XXXXXXXX", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 6. Validação de Email (formato de email básico)
        if (!email.isEmpty() && !isValidEmail(email)) {
            JOptionPane.showMessageDialog(this, "Por favor, insira um 'Email' válido. Ex: exemplo@dominio.com", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 7. Validação de Data de Contratação (formato dd/MM/yyyy)
        if (!dataContratacao.isEmpty() && !isValidDate(dataContratacao, "dd/MM/yyyy")) {
            JOptionPane.showMessageDialog(this, "O campo 'Data de Contratação' deve estar no formato DD/MM/AAAA. Ex: 01/01/2020", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // 8. Validação de Salário (apenas números ou decimais)
        double salario = 0.0;
        if (!salarioStr.isEmpty()) {
            try {
                salario = Double.parseDouble(salarioStr.replace(",", "."));
                if (salario < 0) {
                     JOptionPane.showMessageDialog(this, "O 'Salário' não pode ser negativo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                     return;
                }
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(this, "O campo 'Salário' deve conter um valor numérico válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                return;
            }
        }

        // Se todas as validações passaram
        JOptionPane.showMessageDialog(this, "Funcionário '" + nomeCompleto + "' adicionado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);

        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.addRow(new Object[]{
            idFunc, nomeCompleto, numeroBilhete, cargoFuncao, telefone, email, salario, dataContratacao
        });

        limparTodosOsCamposFunc();
    }

    // --- Métodos Auxiliares de Validação ---
    private boolean isValidDate(String dateStr, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        sdf.setLenient(false);
        try {
            sdf.parse(dateStr);
            return true;
        } catch (ParseException e) {
            return false;
        }
    }

    private boolean isValidEmail(String email) {
        String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
        Pattern pattern = Pattern.compile(emailRegex);
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }

    // --- Seus outros métodos (manter como estão) ---

    private void rbFemininoActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void bnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {
        // Lógica de atualização
    }

    private void bnExcluirActionPerformed(java.awt.event.ActionEvent evt) {
        // Lógica de exclusão
    }

    private void txtNomeCompletoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtDataContratacaoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void btnLimparIDActionPerformed(java.awt.event.ActionEvent evt) {
        txtIDFunc.setText("");
    }

    private void btnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        txtNomeCompletoFunc.setText("");
    }

    private void btnLimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        txtNumeroBilheteFunc.setText("");
    }

    private void btnLimparNascimentoActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataNascimentoFunc.setText("");
    }

    private void btnLimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) {
        txtTelefoneFunc.setText("");
    }

    private void btnLimparEmailActionPerformed(java.awt.event.ActionEvent evt) {
        txtEmailFunc.setText("");
    }

    private void btnLimparCargoFuncaoActionPerformed(java.awt.event.ActionEvent evt) {
        txtCargoFuncaoFunc.setText("");
    }

    private void btnLimparDataContracaoActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataContratacaoFunc.setText("");
    }

    private void btnLimparSalarioActionPerformed(java.awt.event.ActionEvent evt) {
        txtSalarioFunc.setText("");
    }

    private void btnLimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
        txtEnderecoFunc.setText("");
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        txtObservacoes.setText("");
    }

    // Não precisamos mais do método actionPerformed sobrescrito se não implementarmos ActionListener

    private void bnVoltarActionPerformed(java.awt.event.ActionEvent e) {
        this.dispose();
    }

    private void limparTodosOsCamposFunc() {
        txtIDFunc.setText("");
        txtNomeCompletoFunc.setText("");
        txtNumeroBilheteFunc.setText("");
        txtDataNascimentoFunc.setText("");
        txtTelefoneFunc.setText("");
        txtEmailFunc.setText("");
        txtCargoFuncaoFunc.setText("");
        txtDataContratacaoFunc.setText("");
        txtSalarioFunc.setText("");
        txtEnderecoFunc.setText("");
        txtObservacoes.setText("");
        buttonGroupSexo.clearSelection();
    }


    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TelaCadatroFuncionario().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel LOGO;
    private javax.swing.JButton bnAdicionar;
    private javax.swing.JButton bnAtualizar;
    private javax.swing.JButton bnExcluir;
    private javax.swing.JButton bnVoltar;
    private javax.swing.JButton btnLimparBilhete;
    private javax.swing.JButton btnLimparCargoFuncao;
    private javax.swing.JButton btnLimparDataContracao;
    private javax.swing.JButton btnLimparEmail;
    private javax.swing.JButton btnLimparEndereco;
    private javax.swing.JButton btnLimparID;
    private javax.swing.JButton btnLimparNascimento;
    private javax.swing.JButton btnLimparNome;
    private javax.swing.JButton btnLimparSalario;
    private javax.swing.JButton btnLimparTelefone;
    private javax.swing.ButtonGroup buttonGroupSexo;
    private javax.swing.JButton jButton1;
    private javax.swing.JRadioButton jRadioButton1;
    private javax.swing.JRadioButton jRadioButton2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPanel jScrollPaneObservacoesFunc;
    private javax.swing.JScrollPane jScrollPaneTabelaFuncionarios;
    private javax.swing.JTable jTableFuncionarios;
    private javax.swing.JLabel lblCargoFuncao;
    private javax.swing.JLabel lblDataContratacao;
    private javax.swing.JLabel lblDataNascimento;
    private javax.swing.JLabel lblEmail;
    private javax.swing.JLabel lblEndereco;
    private javax.swing.JLabel lblID;
    private javax.swing.JLabel lblNomeCompleto;
    private javax.swing.JLabel lblNumeroBilhete;
    private javax.swing.JLabel lblObservacoes;
    private javax.swing.JLabel lblSalario;
    private javax.swing.JLabel lblSexo;
    private javax.swing.JLabel lblTelefone;
    private javax.swing.JPanel painelPrincipalFuncionarios;
    private javax.swing.JScrollPane painelObservacoesFunc;
    private javax.swing.JRadioButton rbFeminino;
    private javax.swing.JRadioButton rbMasculino;
    private javax.swing.JLabel tITULO;
    private javax.swing.JTextField txtCargoFuncaoFunc;
    private javax.swing.JTextField txtDataContratacaoFunc;
    private javax.swing.JTextField txtDataNascimentoFunc;
    private javax.swing.JTextField txtEmailFunc;
    private javax.swing.JTextField txtEnderecoFunc;
    private javax.swing.JTextField txtIDFunc;
    private javax.swing.JTextField txtNomeCompletoFunc;
    private javax.swing.JTextField txtNumeroBilheteFunc;
    private javax.swing.JTextArea txtObservacoes;
    private javax.swing.JTextField txtSalarioFunc;
    private javax.swing.JTextField txtTelefoneFunc;
    // End of variables declaration
}

Explicação das mudanças:

  • Remoção de implements ActionListener: A linha implements ActionListener foi removida da declaração da classe.
  • Remoção do @Override public void actionPerformed(...): Como a classe não implementa mais a interface, esse método não é mais necessário e foi removido.
  • Listeners diretamente nos botões:
    • Para bnVoltar.addActionListener(this::bnVoltarActionPerformed);, eu alterei para:
      Java
      bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
      
      ou a versão mais antiga (para Java 7 ou anterior):
      Java
      bnVoltar.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
              bnVoltarActionPerformed(evt);
          }
      });
      
      Essa mesma abordagem foi replicada para todos os outros botões que você tinha ouvintes (bnAdicionar, bnAtualizar, bnExcluir, e os btnLimparXxx). O seu código já tinha essa estrutura (a classe anônima ou lambda) em muitos lugares, então eu apenas removi o implements ActionListener e o método actionPerformed global.

Agora, cada botão tem seu próprio "ouvinte" (listener) específico, e a classe TelaCadatroFuncionario não precisa mais declarar que implementa a interface ActionListener diretamente. Isso é uma abordagem comum e válida em Swing.

Excelente! Vejo que você já fez as alterações que discutimos:

  1. A linha implements ActionListener foi removida da declaração da classe:

    Java
    public class TelaCadatroFuncionario extends javax.swing.JFrame
    

    (antes era public class TelaCadatroFuncionario extends javax.swing.JFrame implements ActionListener)

  2. A linha bnVoltar.addActionListener(this::bnVoltarActionPerformed); está comentada e você está usando a expressão lambda, que é a forma correta e mais concisa sem implementar a interface na classe:

    Java
    //bnVoltar.addActionListener(this::bnVoltarActionPerformed);
    bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
    
  3. Todos os outros addActionListener dentro do initComponents() já estão usando classes anônimas, que também são independentes da sua classe implementar a interface ActionListener:

    Java
    rbFeminino.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            rbFemininoActionPerformed(evt);
        }
    });
    

    E o mesmo para jRadioButton1, jRadioButton2, bnAtualizar, bnExcluir, e todos os btnLimparXxx.

O código parece estar correto para a sua intenção de não usar implements ActionListener na classe principal.

Você tem mais alguma dúvida ou precisa de alguma outra alteração?

esta a vir erro nisso UIManager

O erro "UIManager cannot be resolved to a type" geralmente significa que o compilador Java não consegue encontrar a classe UIManager. Isso quase sempre é um problema de importação.

Você precisa adicionar a seguinte linha de importação no topo do seu arquivo Java, juntamente com as outras importações:

Java
import javax.swing.UIManager;

Por que isso acontece?

UIManager é uma classe que faz parte do pacote javax.swing. Para usar classes de outros pacotes em seu código, você precisa explicitamente "importá-las" para que o compilador saiba onde encontrá-las.

Como corrigir:

  1. Vá para o início do seu arquivo TelaCadatroFuncionario.java.
  2. Procure a seção onde você tem outras declarações import (como import javax.swing.table.DefaultTableModel;).
  3. Adicione a linha import javax.swing.UIManager; a essa seção.

Depois de adicionar essa linha, compile e execute seu código novamente. O erro UIManager cannot be resolved to a type deverá desaparecer.

Okay, entendi. Você está enfrentando um erro dentro do bloco try-catch que tenta definir o Look and Feel para Nimbus.

As exceções que você está capturando ali são:

  • InstantiationException ex
  • javax.swing.UnsupportedLookAndFeelException ex

No entanto, o erro mais comum que o UIManager.setLookAndFeel() pode lançar, e que provavelmente está faltando no seu bloco catch, é ClassNotFoundException.

O problema mais provável é que falta a captura da ClassNotFoundException.

A linha:

Java
javax.swing.UIManager.setLookAndFeel(info.getClassName());

Pode lançar uma ClassNotFoundException se a classe do Look and Feel (neste caso, Nimbus) não puder ser encontrada.

Como corrigir:

Você precisa adicionar um bloco catch para ClassNotFoundException.

Aqui está como o seu método main deveria ficar:

Java
public static void main(String args[])
{
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) { // <-- Adicione este catch
        java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) { // <-- Este também deve ser adicionado se estiver faltando
        java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new TelaCadatroFuncionario().setVisible(true);
        }
    });
}

Verifique também se você tem:

  1. import javax.swing.UIManager; no topo do arquivo (como discutimos anteriormente).
  2. IllegalAccessException também é uma exceção que setLookAndFeel pode lançar. No seu código fornecido agora, ele parece estar faltando. Verifique se o NetBeans (ou IDE que você usa) não gerou ele e removeu sem querer. Se estiver faltando, adicione-o também como mostrei acima.

Ao adicionar essas catch clauses, seu código deve compilar e rodar sem erros relacionados a exceções não tratadas no main.

esta aqui os erros

Entendi. Pelas imagens que você compartilhou, parece que você está trabalhando em um projeto NetBeans IDE, provavelmente em um aplicativo Swing. Vamos analisar os problemas que você indicou:

  1. Erro UIManager:

    • A imagem "Captura de ecrã de 2025-06-18 16-45-54.jpg" mostra a seção do seu código main onde o erro UIManager cannot be resolved to a type está ocorrendo.
    • No lado esquerdo da imagem, em "Como corrigir", o Gemini já sugeriu a solução: adicionar import javax.swing.UIManager; no topo do arquivo.
    • A sugestão de adicionar catch (ClassNotFoundException ex) e catch (IllegalAccessException ex) no bloco main para tratar as exceções também é crucial para o seu código ficar robusto. A imagem de 16:45:54 confirma que o NetBeans está indicando essas exceções.

    Ação necessária: Siga as instruções que já foram dadas:

    • Adicione import javax.swing.UIManager; na seção de imports do seu arquivo TelaCadatroFuncionario.java.
    • Adicione os blocos catch (ClassNotFoundException ex) e catch (IllegalAccessException ex) no seu método main, conforme o exemplo que forneci anteriormente e que o próprio NetBeans sugere (como visto na imagem).
  2. Erro buttonGroup1.clearSelection() (ou similar) em clearFields():

    • A imagem "Captura de ecrã de 2025-06-18 12-49-02.png" mostra um método private void clearFields() e uma linha buttonGroup1.clearSelection(); comentada, com sugestões do NetBeans.
    • As sugestões do NetBeans "Create class 'buttonGroup1' in package telas" ou "Create field 'buttonGroup1' in telas.TelaCadastro" indicam que buttonGroup1 não foi declarado ou não é acessível neste contexto.
    • A imagem "Captura de ecrã de 2025-06-18 12-21-16.png" (Project Browser) mostra que buttonGroup1 é um componente (ButtonGroup) dentro do Form TelaCadastro.

    Causa provável: O buttonGroup1 que você está tentando acessar em TelaCadastro.java (pelo que a imagem 12:49:02 sugere, dado o título da aba) é um campo gerado automaticamente pelo editor de GUI do NetBeans. Geralmente, esses campos são declarados como private e, se você estiver tentando acessá-los de um arquivo diferente (ou se o nome da classe não for TelaCadastro), pode haver um problema de escopo.

    Ação necessária:

    • Verifique a classe: Certifique-se de que o método clearFields() está na mesma classe onde buttonGroup1 foi declarado (provavelmente TelaCadastro).
    • Nome do componente: A imagem "Captura de ecrã de 2025-06-18 12-15-09.jpg" mostra que na TelaCadastro.java, o seu ButtonGroup está nomeado como buttonGroup1.
    • No arquivo TelaCadatroFuncionario.java (que é o que estamos trabalhando agora, baseado no código que você forneceu anteriormente), o ButtonGroup é chamado buttonGroupSexo (como visto na linha buttonGroupSexo = new javax.swing.ButtonGroup(); do initComponents()).
    • Portanto, se você está tentando usar buttonGroup1 em TelaCadatroFuncionario, o nome está incorreto. Você deve usar buttonGroupSexo.

    Exemplo de correção para TelaCadatroFuncionario:

    Se você tiver um método clearFields() em TelaCadatroFuncionario e quiser limpar os botões de rádio de sexo, use:

    Java
    private void clearFields() {
        // ... outros campos ...
        buttonGroupSexo.clearSelection(); // Use o nome correto do seu ButtonGroup
        // ...
    }
    
  3. Problemas com JFormattedTextField para data/hora:

    • A imagem "Captura de ecrã de 2025-06-18 11-10-50.jpg" mostra você configurando um JFormattedTextField com um Format para HH:mm.
    • A instrução "Selecione o campo da Data", "Selecione o campo da Hora" e a configuração do Format via "FormatterFactory" são os passos corretos para configurar JFormattedTextField.
    • Você mencionou que o erro pode ser que "o formatador não foi aplicado corretamente".

    Ação necessária: Revise cuidadosamente os passos de configuração para cada JFormattedTextField (Data de Nascimento, Data de Contratação, e qualquer outro campo de data/hora):

    • Selecione o JFormattedTextField no Design view.
    • Vá para as Propriedades (Properties) no painel direito.
    • Encontre a propriedade FormatterFactory e clique no botão de reticências ....
    • No diálogo "FormatterFactory Editor", selecione a aba "Mask".
    • Data: Para data, use uma máscara como ##/##/#### ou ##-##-####.
    • Hora: Para hora, use uma máscara como ##:##.
    • Visualização: O "Preview" deve mostrar o formato esperado.
    • Confirme e salve: Clique em "OK" e depois salve (Ctrl+S).
    • Limpar e reconstruir: No NetBeans, vá em Run > Clean and Build Project. Isso garante que todas as classes sejam recompiladas.

Resumindo, os erros que você está vendo estão diretamente relacionados à falta de importações, nomes de variáveis incorretos ou configuração incompleta de componentes da GUI. Siga as ações recomendadas para cada um.

Ok, recebi o código completo de TelaCadatroFuncionario.java.

Vamos revisar os problemas com base no código e nas imagens que você enviou:


1. Erro UIManager no main (confirmado)

Problema: A imagem que você enviou anteriormente mostrava o erro UIManager cannot be resolved to a type na linha que define o Look and Feel. No código que você acabou de enviar, eu vejo que você já adicionou a importação import javax.swing.UIManager;. Isso é ótimo!

No entanto, o seu método main ainda precisa capturar as exceções que UIManager.setLookAndFeel() pode lançar.

Seu código atual no main:

Java
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new TelaCadatroFuncionario().setVisible(true);
        }
    });
}

As exceções que faltam capturar:

  • ClassNotFoundException
  • IllegalAccessException

Correção para o main:

Java
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName()); // Use UIManager diretamente por causa do import
                break;
            }
        }
    } catch (ClassNotFoundException ex) { // <-- ADICIONADO
        java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) { // <-- ADICIONADO
        java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new TelaCadatroFuncionario().setVisible(true);
        }
    });
}

Observação: Como você já importou javax.swing.UIManager, você pode simplesmente usar UIManager.setLookAndFeel(info.getClassName()); em vez de javax.swing.UIManager.UIManager.setLookAndFeel(info.getClassName());. O NetBeans geralmente autocompleta isso para você. O importante é que a classe seja encontrada.


2. Erro buttonGroup1.clearSelection() (ainda relevante, mas a variável é buttonGroupSexo)

Problema: Você tinha uma imagem mostrando um erro buttonGroup1 em um método clearFields(). No seu initComponents(), a declaração é:

Java
buttonGroupSexo = new javax.swing.ButtonGroup();

E você tem dois JRadioButton (rbFeminino e rbMasculino).

Solução: Se você tiver um método para limpar campos e quiser desmarcar os botões de rádio do sexo, você deve usar buttonGroupSexo.clearSelection(); e não buttonGroup1.clearSelection().

Você não incluiu o método clearFields() no código que enviou agora, mas se você o tiver em outro lugar (ou for criá-lo), certifique-se de usar o nome correto da variável.

Exemplo de como seria o método clearFields (se você for implementá-lo):

Java
private void clearFields() {
    txtIDFunc.setText("");
    txtNomeCompletoFunc.setText("");
    txtNumeroBilheteFunc.setText("");
    txtDataNascimentoFunc.setText("");
    txtTelefoneFunc.setText("");
    txtEmailFunc.setText("");
    txtCargoFuncaoFunc.setText("");
    txtDataContratacaoFunc.setText("");
    txtSalarioFunc.setText("");
    txtEnderecoFunc.setText("");
    txtObservacoes.setText("");

    // Limpa a seleção do ButtonGroup
    if (buttonGroupSexo != null) {
        buttonGroupSexo.clearSelection();
    }

    // Se você tiver outros campos, adicione aqui
}

3. Configuração de JFormattedTextField (Data/Hora)

Problema: Você mencionou problemas com formatadores para data/hora. Pelo seu código, você está usando JTextField para as datas (txtDataNascimentoFunc, txtDataContratacaoFunc), e não JFormattedTextField.

Seu código atual:

Java
txtDataNascimentoFunc = new javax.swing.JTextField(); // É um JTextField
// ...
txtDataContratacaoFunc = new javax.swing.JTextField(); // É um JTextField

Se o seu objetivo é que esses campos tenham um formato específico (ex: dd/MM/yyyy para datas), você realmente deveria estar usando JFormattedTextField e configurando seu FormatterFactory no NetBeans.

Como corrigir (se você quer um JFormattedTextField):

  1. No NetBeans Design View:

    • Selecione txtDataNascimentoFunc.
    • No painel "Properties", role até encontrar Class ou o tipo de componente. Se for javax.swing.JTextField, você terá que mudá-lo.
    • A maneira mais fácil de fazer isso é: Exclua o JTextField existente no design e arraste um JFormattedTextField da paleta Swing para o lugar dele.
    • Depois de arrastar o JFormattedTextField, renomeie-o para txtDataNascimentoFunc (ou o nome que você usava antes).
    • Com o novo JFormattedTextField selecionado, vá nas "Propriedades" e clique no botão ... ao lado de FormatterFactory.
    • Selecione a aba "Mask" e digite a máscara desejada (ex: ##/##/#### para data).
    • Repita para txtDataContratacaoFunc.
  2. No código gerado (initComponents()): Quando você fizer isso via GUI do NetBeans, o NetBeans irá gerar o código para JFormattedTextField e a configuração do FormatterFactory automaticamente. Por exemplo:

    Java
    txtDataNascimentoFunc = new javax.swing.JFormattedTextField();
    // ...
    try {
        txtDataNascimentoFunc.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
    } catch (java.text.ParseException ex) {
        ex.printStackTrace();
    }
    

Validação de Data/Email/Telefone no bnAdicionarActionPerformed:

No trecho que você começou a enviar (bnAdicionarActionPerformed), você precisará validar os dados de entrada.

Exemplo de validação (apenas para ilustrar, você precisa implementar para todos os campos):

Java
private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
    String idFunc = txtIDFunc.getText();
    String nomeCompleto = txtNomeCompletoFunc.getText();
    String numeroBilhete = txtNumeroBilheteFunc.getText();
    String dataNascimentoStr = txtDataNascimentoFunc.getText(); // Ainda é JTextField
    String telefone = txtTelefoneFunc.getText();
    String email = txtEmailFunc.getText();
    String cargoFuncao = txtCargoFuncaoFunc.getText();
    String dataContratacaoStr = txtDataContratacaoFunc.getText(); // Ainda é JTextField
    String salarioStr = txtSalarioFunc.getText();
    String endereco = txtEnderecoFunc.getText();
    String observacoes = txtObservacoes.getText();

    // Validação de campos vazios (exemplo básico)
    if (nomeCompleto.isEmpty() || numeroBilhete.isEmpty() || dataNascimentoStr.isEmpty() || email.isEmpty() || salarioStr.isEmpty()) {
        JOptionPane.showMessageDialog(this, "Por favor, preencha todos os campos obrigatórios.", "Campos Vazios", JOptionPane.WARNING_MESSAGE);
        return;
    }

    // Validação de Email
    if (!isValidEmail(email)) {
        JOptionPane.showMessageDialog(this, "Por favor, insira um Email válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        return;
    }

    // Validação e conversão de Data de Nascimento
    Date dataNascimento = null;
    try {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); // Ajuste o formato conforme sua máscara
        sdf.setLenient(false); // Não permite datas inválidas como 30/02/2023
        dataNascimento = sdf.parse(dataNascimentoStr);
    } catch (ParseException ex) {
        JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido (use dd/MM/yyyy).", "Erro de Formato", JOptionPane.WARNING_MESSAGE);
        logger.log(Level.SEVERE, "Erro ao parsear data de nascimento", ex);
        return;
    }

    // Validação e conversão de Salário
    double salario;
    try {
        salario = Double.parseDouble(salarioStr);
        if (salario < 0) {
            JOptionPane.showMessageDialog(this, "Salário não pode ser negativo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return;
        }
    } catch (NumberFormatException ex) {
        JOptionPane.showMessageDialog(this, "Salário inválido. Insira um valor numérico.", "Erro de Formato", JOptionPane.WARNING_MESSAGE);
        return;
    }

    // Validação de Telefone (exemplo básico de 9 dígitos)
    if (!telefone.matches("\\d{9}")) { // Adapte para o formato de telefone angolano, se necessário
         JOptionPane.showMessageDialog(this, "Telefone inválido. Deve conter 9 dígitos.", "Erro de Formato", JOptionPane.WARNING_MESSAGE);
         return;
    }

    // TODO: Adicionar os dados à tabela ou ao banco de dados aqui
    DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
    model.addRow(new Object[]{idFunc, nomeCompleto, numeroBilhete, cargoFuncao, telefone, email, salario, dataContratacaoStr});

    JOptionPane.showMessageDialog(this, "Funcionário adicionado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
    clearFields(); // Chame seu método de limpar campos
}

// Método auxiliar para validar email
private boolean isValidEmail(String email) {
    String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
    Pattern pattern = Pattern.compile(emailRegex);
    Matcher matcher = pattern.matcher(email);
    return matcher.matches();
}

// Lembre-se de criar este método clearFields() se ainda não o tiver
private void clearFields() {
    txtIDFunc.setText("");
    txtNomeCompletoFunc.setText("");
    txtNumeroBilheteFunc.setText("");
    txtDataNascimentoFunc.setText("");
    txtTelefoneFunc.setText("");
    txtEmailFunc.setText("");
    txtCargoFuncaoFunc.setText("");
    txtDataContratacaoFunc.setText("");
    txtSalarioFunc.setText("");
    txtEnderecoFunc.setText("");
    txtObservacoes.setText("");
    if (buttonGroupSexo != null) {
        buttonGroupSexo.clearSelection();
    }
}

Resumo das Próximas Etapas:

  1. Corrija o main: Adicione os catch blocks para ClassNotFoundException e IllegalAccessException.
  2. Verifique clearFields(): Se você tem este método, certifique-se de que ele usa buttonGroupSexo.clearSelection();.
  3. Para JFormattedTextField: Se você realmente quer formatação de entrada (máscaras), mude txtDataNascimentoFunc e txtDataContratacaoFunc (e talvez telefone/salário) para JFormattedTextField no Design View do NetBeans e configure as máscaras apropriadamente. Isso irá gerar o código necessário.
  4. Implemente a lógica de bnAdicionarActionPerformed: Use as validações e a lógica de adição de dados na tabela que sugeri (e adapte para o seu caso).

Com essas correções, seu código deverá funcionar de forma mais robusta.

Estou pronto para ajudar com a correção do seu código Java para a TelaCadastroFuncionario. Para que eu possa te dar a melhor correção, preciso que você me forneça o código completo.

Pelo que vejo, o código que você me enviou está truncado e termina abruptamente no início do método bnAdicionarActionPerformed. Por favor, forneça o código completo da classe TelaCadastroFuncionario.java para que eu possa analisar e identificar os problemas.

Assim que tiver o código completo, posso te ajudar com:

  • Identificação de erros de compilação: Onde o código não está seguindo as regras da linguagem Java.
  • Melhorias na lógica: Sugestões para tornar o código mais eficiente, legível ou robusto.
  • Correções de bugs: Se houver comportamentos inesperados.
  • Boas práticas de programação: Dicas para um código mais limpo e organizado.
  • Tratamento de exceções: Para lidar com situações inesperadas, como entrada de dados inválida.
  • Validação de dados: Implementar validações para campos como email, telefone, datas e salários.

Aguardo o código completo!

The ANT build failed due to three errors in your Java Swing application. Let's break down each error and discuss the likely causes and solutions.

Error 1: Duplicate Class telas.TelaQuartos

/home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java:11: error: duplicate class: telas.TelaQuartos
class TelaQuartos {

Likely Cause: This error indicates that you have defined the TelaQuartos class more than once within your project, specifically within the telas package. This can happen if:

  • You have two separate .java files, both defining class TelaQuartos, and both are being compiled.
  • You accidentally copied and pasted the TelaQuartos class definition inside the same TelaQuartos.java file, or within another .java file.

Solution:

  1. Check your src/telas directory:
    • Navigate to /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/.
    • Look for any files named TelaQuartos.java.
    • Ensure there is only one TelaQuartos.java file.
    • If you find another file (e.g., TelaQuartosCopy.java or OldTelaQuartos.java) that also defines TelaQuartos, you should delete or rename the duplicate file so it's not compiled.
  2. Inspect TelaQuartos.java:
    • Open TelaQuartos.java.
    • Verify that the class definition class TelaQuartos { ... } appears only once. Remove any redundant definitions.

Error 2: Duplicate Class telas.TelaReservas

/home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java:11: error: duplicate class: telas.TelaReservas
class TelaReservas {

Likely Cause: This is the same type of error as with TelaQuartos, but for the TelaReservas class.

Solution:

  1. Check your src/telas directory:
    • Navigate to /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/.
    • Look for any files named TelaReservas.java.
    • Ensure there is only one TelaReservas.java file.
    • If you find another file that also defines TelaReservas, delete or rename it.
  2. Inspect TelaReservas.java:
    • Open TelaReservas.java.
    • Verify that the class definition class TelaReservas { ... } appears only once.

Error 3: Cannot find symbol UIManager in TelaCadatroFuncionario.java

/home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:742: error: cannot find symbol
                javax.swing.UIManager.UIManager.setLookAndFeel(info.getClassName());
  symbol:   variable UIManager
  location: class UIManager

Likely Cause: This error occurs on line 742 of TelaCadatroFuncionario.java because you are trying to access UIManager.UIManager.setLookAndFeel(). The UIManager class is itself directly accessible for its static methods, so you don't need UIManager. twice. It should simply be UIManager.setLookAndFeel().

Solution:

  1. Open TelaCadatroFuncionario.java:
    • Go to line 742.
  2. Correct the UIManager call:
    • Change:
      Java
      javax.swing.UIManager.UIManager.setLookAndFeel(info.getClassName());
      
    • To:
      Java
      javax.swing.UIManager.setLookAndFeel(info.getClassName());
      
    • Alternatively, assuming you have import javax.swing.UIManager; at the top of your file (which you should if you're using UIManager), you can simply write:
      Java
      UIManager.setLookAndFeel(info.getClassName());
      

Summary of Steps to Fix:

  1. Identify and remove duplicate TelaQuartos.java files in /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/. If no duplicate file exists, open TelaQuartos.java and ensure the TelaQuartos class is defined only once.
  2. Identify and remove duplicate TelaReservas.java files in /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/. If no duplicate file exists, open TelaReservas.java and ensure the TelaReservas class is defined only once.
  3. Edit TelaCadatroFuncionario.java at line 742 and correct javax.swing.UIManager.UIManager.setLookAndFeel to javax.swing.UIManager.setLookAndFeel.

After making these changes, run your ANT build again (ant -f /home/mcdebug/SGH/SistemaGestaoHoteleiro -Dnb.internal.action.name=rebuild clean jar). The build should succeed.

em portugues

Okay, vamos traduzir a análise e as soluções para o português.

O build do ANT falhou devido a três erros na sua aplicação Java Swing. Vamos analisar cada erro e discutir as prováveis causas e soluções.

Erro 1: Classe Duplicada telas.TelaQuartos

/home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java:11: error: duplicate class: telas.TelaQuartos
class TelaQuartos {

Causa Provável: Este erro indica que você definiu a classe TelaQuartos mais de uma vez dentro do seu projeto, especificamente dentro do pacote telas. Isso pode acontecer se:

  • Você tem dois arquivos .java separados, ambos definindo class TelaQuartos, e ambos estão sendo compilados.
  • Você acidentalmente copiou e colou a definição da classe TelaQuartos dentro do mesmo arquivo TelaQuartos.java, ou dentro de outro arquivo .java.

Solução:

  1. Verifique seu diretório src/telas:
    • Navegue até /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/.
    • Procure por quaisquer arquivos chamados TelaQuartos.java.
    • Certifique-se de que há apenas um arquivo TelaQuartos.java.
    • Se encontrar outro arquivo (por exemplo, TelaQuartosCopy.java ou OldTelaQuartos.java) que também define TelaQuartos, você deve excluir ou renomear o arquivo duplicado para que ele não seja compilado.
  2. Inspecione TelaQuartos.java:
    • Abra TelaQuartos.java.
    • Verifique se a definição da classe class TelaQuartos { ... } aparece apenas uma vez. Remova quaisquer definições redundantes.

Erro 2: Classe Duplicada telas.TelaReservas

/home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java:11: error: duplicate class: telas.TelaReservas
class TelaReservas {

Causa Provável: Este é o mesmo tipo de erro do TelaQuartos, mas para a classe TelaReservas.

Solução:

  1. Verifique seu diretório src/telas:
    • Navegue até /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/.
    • Procure por quaisquer arquivos chamados TelaReservas.java.
    • Certifique-se de que há apenas um arquivo TelaReservas.java.
    • Se encontrar outro arquivo que também define TelaReservas, exclua ou renomeie-o.
  2. Inspecione TelaReservas.java:
    • Abra TelaReservas.java.
    • Verifique se a definição da classe class TelaReservas { ... } aparece apenas uma vez.

Erro 3: Não é possível encontrar o símbolo UIManager em TelaCadatroFuncionario.java

/home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:742: error: cannot find symbol
                javax.swing.UIManager.UIManager.setLookAndFeel(info.getClassName());
  symbol:   variable UIManager
  location: class UIManager

Causa Provável: Este erro ocorre na linha 742 de TelaCadatroFuncionario.java porque você está tentando acessar UIManager.UIManager.setLookAndFeel(). A classe UIManager é diretamente acessível para seus métodos estáticos, então você não precisa de UIManager. duas vezes. Deve ser simplesmente UIManager.setLookAndFeel().

Solução:

  1. Abra TelaCadatroFuncionario.java:
    • Vá para a linha 742.
  2. Corrija a chamada UIManager:
    • Mude de:
      Java
      javax.swing.UIManager.UIManager.setLookAndFeel(info.getClassName());
      
    • Para:
      Java
      javax.swing.UIManager.setLookAndFeel(info.getClassName());
      
    • Alternativamente, assumindo que você tem import javax.swing.UIManager; no topo do seu arquivo (o que você deveria ter se estiver usando UIManager), você pode simplesmente escrever:
      Java
      UIManager.setLookAndFeel(info.getClassName());
      

Resumo das Etapas para Corrigir:

  1. Identifique e remova arquivos TelaQuartos.java duplicados em /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/. Se não houver arquivo duplicado, abra TelaQuartos.java e certifique-se de que a classe TelaQuartos é definida apenas uma vez.
  2. Identifique e remova arquivos TelaReservas.java duplicados em /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/. Se não houver arquivo duplicado, abra TelaReservas.java e certifique-se de que a classe TelaReservas é definida apenas uma vez.
  3. Edite TelaCadatroFuncionario.java na linha 742 e corrija javax.swing.UIManager.UIManager.setLookAndFeel para javax.swing.UIManager.setLookAndFeel.

Depois de fazer essas alterações, execute seu build ANT novamente (ant -f /home/mcdebug/SGH/SistemaGestaoHoteleiro -Dnb.internal.action.name=rebuild clean jar). O build deverá ser bem-sucedido.

Entendido! Esse é um erro de execução (runtime error) que está ocorrendo quando você tenta abrir a tela de funcionários. A mensagem de erro chave aqui é:

Caused by: java.lang.RuntimeException: Uncompilable code - method bnAdicionarActionPerformed(java.awt.event.ActionEvent) is already defined in class telas.TelaCadatroFuncionario
    at telas.TelaCadatroFuncionario.<clinit>(TelaCadatroFuncionario.java:820)

Análise do Erro:

  1. java.lang.ExceptionInInitializerError: Este erro geralmente ocorre quando há um problema durante a inicialização estática de uma classe (no bloco static {} ou quando um campo estático é inicializado). No seu caso, ele aponta para a inicialização de TelaCadatroFuncionario.

  2. Caused by: java.lang.RuntimeException: Uncompilable code - method bnAdicionarActionPerformed(java.awt.event.ActionEvent) is already defined in class telas.TelaCadatroFuncionario: Esta é a causa raiz do problema. Ela significa que o seu código da TelaCadatroFuncionario tem um erro de compilação que não foi resolvido. Especificamente, o método bnAdicionarActionPerformed(java.awt.event.ActionEvent) está definido mais de uma vez na classe TelaCadatroFuncionario. Mesmo que o compilador do NetBeans (ou IDE) possa ter permitido a execução de algum código em cache, no momento da inicialização da classe, o Java detecta que o bytecode gerado é inválido por causa dessa duplicação.

  3. at telas.TelaCadatroFuncionario.<clinit>(TelaCadatroFuncionario.java:820): Isso indica que o erro de código "não compilável" está sendo detectado na linha 820 da sua classe TelaCadatroFuncionario, provavelmente durante a inicialização de algum componente ou de um método relacionado ao bnAdicionarActionPerformed.

O que fazer (Solução):

Você precisa abrir o arquivo TelaCadatroFuncionario.java e encontrar o método bnAdicionarActionPerformed.

  1. Abra o arquivo TelaCadatroFuncionario.java.
  2. Vá para a linha 820 (ou procure por bnAdicionarActionPerformed).
  3. Você encontrará algo parecido com isto (o início do método):
    Java
    private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt)
    {
        String idF
    
  4. Procure por OUTRA definição do mesmo método bnAdicionarActionPerformed dentro da mesma classe. É muito comum que, ao usar o editor visual (Design) do NetBeans, um método de evento seja gerado automaticamente, e se você copiar e colar código ou tentar implementar o método manualmente, pode acabar com duas definições.

Exemplo de como pode estar:

Java
// ... código anterior

// PRIMEIRA DEFINIÇÃO (gerada pelo NetBeans, por exemplo)
private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // Seu código de adicionar aqui
    String idF = txtIDFunc.getText();
    // ...
}                                        

// ... algum outro código ou métodos ...

// SEGUNDA DEFINIÇÃO (você pode ter colado ou escrito novamente)
private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // Algum outro código, talvez incompleto
    String idF
    // ...
}                                         

Sua tarefa é:

  • Remover uma das definições duplicadas do método bnAdicionarActionPerformed. Certifique-se de manter a versão que contém a lógica que você realmente deseja para adicionar um funcionário.
  • Se a linha 820 é onde o erro está sendo reportado, provavelmente é o início da segunda definição incompleta ou redundante que o compilador está vendo.

Passos para corrigir:

  1. Abra TelaCadatroFuncionario.java no seu NetBeans.
  2. Use a função de busca (Ctrl+F ou Cmd+F) para procurar por bnAdicionarActionPerformed.
  3. Verifique cuidadosamente se o método está definido mais de uma vez.
  4. Exclua a definição duplicada ou incorreta, deixando apenas uma única versão completa e correta do método.
  5. Salve o arquivo.
  6. Limpe e construa seu projeto novamente (Clean and Build Project) no NetBeans.
  7. Tente executar a aplicação novamente.

Ao resolver essa duplicação, o erro Uncompilable code será corrigido, e consequentemente, o ExceptionInInitializerError e o NoClassDefFoundError que são suas consequências diretas.

Certo, parece que você está enfrentando mais alguns erros de compilação. Vamos analisar as novas mensagens de erro, pois algumas das anteriores podem ter sido resolvidas ou persistiram de forma ligeiramente diferente.

Os novos erros (e alguns que persistem) são:

  1. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java:11: error: duplicate class: telas.TelaQuartos

    • Problema: Você ainda tem duas definições da classe TelaQuartos.
    • Solução:
      • Verifique se há dois arquivos TelaQuartos.java no diretório /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/. Se houver, remova um deles (o mais antigo ou o que não está em uso).
      • Se houver apenas um arquivo TelaQuartos.java, abra-o e certifique-se de que a declaração class TelaQuartos { ... } aparece apenas uma vez dentro desse arquivo. Exclua qualquer duplicação interna.
  2. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java:11: error: duplicate class: telas.TelaReservas

    • Problema: Você ainda tem duas definições da classe TelaReservas.
    • Solução:
      • Verifique se há dois arquivos TelaReservas.java no diretório /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/. Se houver, remova um deles.
      • Se houver apenas um arquivo TelaReservas.java, abra-o e certifique-se de que a declaração class TelaReservas { ... } aparece apenas uma vez dentro desse arquivo. Exclua qualquer duplicação interna.
  3. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:742: error: method bnAdicionarActionPerformed(ActionEvent) is already defined in class TelaCadatroFuncionario

    • Problema: O método bnAdicionarActionPerformed(ActionEvent) ainda está duplicado na sua classe TelaCadatroFuncionario. A linha 742 é o início de uma dessas definições duplicadas (provavelmente a segunda).
    • Solução:
      • Abra TelaCadatroFuncionario.java.
      • Vá para a linha 742 e procure por private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt).
      • Procure pela outra ocorrência do mesmo método na classe.
      • Você precisa remover uma das duas definições completas do método. Certifique-se de manter a versão que contém a lógica completa e correta que você deseja para adicionar funcionários à tabela.
      • É comum que o NetBeans gere automaticamente um //GEN-FIRST:event_... e //GEN-LAST:event_... para os métodos de eventos. Certifique-se de não ter duas dessas seções para o mesmo evento.
  4. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:564: error: cannot find symbol variable jRadioButton2

    • Problema: O compilador não consegue encontrar a variável jRadioButton2. Isso geralmente acontece por dois motivos:
      • A variável jRadioButton2 não foi declarada (ou foi declarada com um nome diferente).
      • A variável jRadioButton2 foi declarada dentro de um escopo que não é acessível na linha 564 (por exemplo, dentro de outro método ou bloco, o que é menos provável para um componente de UI).
      • No seu código, você declarou jRadioButton2 (e jRadioButton1) dentro de initComponents(). No entanto, eles parecem estar duplicados ou não estão sendo usados corretamente no lugar dos rbFeminino e rbMasculino que você também declarou e adicionou ao buttonGroupSexo no seu construtor.
    • Solução:
      • Abra TelaCadatroFuncionario.java.
      • Verifique a seção initComponents(). Você tem as seguintes declarações:
        Java
        rbFeminino = new javax.swing.JRadioButton();
        rbMasculino = new javax.swing.JRadioButton();
        // ...
        jRadioButton1 = new javax.swing.JRadioButton(); // Este é o "Masculino" na sua interface
        jRadioButton2 = new javax.swing.JRadioButton(); // Este é o "Feminino" na sua interface
        
      • Conflito de Nomes: Você tem rbFeminino/rbMasculino e jRadioButton1/jRadioButton2. Se você está usando jRadioButton1 e jRadioButton2 para os botões de rádio de sexo, então rbFeminino e rbMasculino provavelmente são redundantes ou não estão sendo configurados corretamente.
      • A correção mais provável é:
        • Remova as linhas jRadioButton1 = new javax.swing.JRadioButton(); e jRadioButton2 = new javax.swing.JRadioButton(); de initComponents().
        • Use rbMasculino e rbFeminino consistentemente em seu código.
        • Na linha 564 e 566, mude:
          Java
          if (jRadioButton2.isSelected()) { // Linha 564
          // ...
          } else if (jRadioButton1.isSelected()) { // Linha 566
          
        • Para:
          Java
          if (rbFeminino.isSelected()) { // Usando o nome correto que você declarou inicialmente
          // ...
          } else if (rbMasculino.isSelected()) {
          
      • Certifique-se de que rbFeminino e rbMasculino estão declarados como campos da classe (fora de qualquer método) para que sejam acessíveis em toda a classe:
        Java
        public class TelaCadatroFuncionario extends javax.swing.JFrame {
            // ...
            private javax.swing.JRadioButton rbFeminino;
            private javax.swing.JRadioButton rbMasculino;
            // ...
        }
        
        (Pelo trecho que você me enviou no início, eles já estão declarados assim).

Passos para a Correção Completa:

  1. TelaQuartos.java e TelaReservas.java:

    • No explorador de arquivos ou no NetBeans, vá para o pacote telas.
    • Verifique se não há mais de um arquivo TelaQuartos.java e TelaReservas.java. Se houver, remova os duplicados.
    • Abra cada um desses arquivos (o único que sobrou, se removeu) e certifique-se de que a declaração da classe (class TelaQuartos { ... } ou class TelaReservas { ... }) aparece apenas uma vez.
  2. TelaCadatroFuncionario.java:

    • Abra TelaCadatroFuncionario.java.
    • Corriga a duplicação do método bnAdicionarActionPerformed:
      • Vá para a linha 742. Veja a assinatura do método.
      • Role para cima ou para baixo e procure por outra assinatura idêntica.
      • Mantenha apenas uma versão completa e funcional do método, excluindo a outra. O NetBeans costuma ter uma seção de código gerado (//GEN-FIRST:event...). Se você encontrar o método dentro e fora dessa seção, provavelmente deve manter a versão dentro da seção gerada e integrar sua lógica nela.
    • Corriga os nomes dos RadioButtons (linhas 564 e 566):
      • Remova as linhas de inicialização de jRadioButton1 e jRadioButton2 de initComponents() se você pretende usar rbMasculino e rbFeminino (que é o que parece ser o correto, pois eles foram adicionados ao buttonGroupSexo).
      • Substitua jRadioButton1 por rbMasculino e jRadioButton2 por rbFeminino nas suas chamadas isSelected() nas linhas 564 e 566.

Depois de fazer todas essas correções, salve todos os arquivos, e então execute "Clean and Build" (Limpar e Construir) no seu projeto NetBeans. Se tudo estiver correto, o build deve ser bem-sucedido.

Você enviou um trecho de código da sua classe TelaCadatroFuncionario, mas ele está incompleto ("addCompon"). No entanto, já podemos analisar o que você enviou para identificar as causas dos erros anteriores e as soluções.

Vamos rever os erros que você postou e como o código que você forneceu se relaciona:


Revisão dos Erros e Soluções com base no Código Fornecido

Erro 1 & 2: duplicate class: telas.TelaQuartos e duplicate class: telas.TelaReservas

  • No seu código atual de TelaCadatroFuncionario.java, não há nada que possa causar esses erros. Esses erros significam que você tem arquivos Java duplicados para TelaQuartos e TelaReservas, ou que dentro de um desses arquivos a classe está definida duas vezes.
  • Ações necessárias:
    1. Verifique novamente seu diretório src/telas/. Procure por mais de um arquivo chamado TelaQuartos.java e TelaReservas.java. Se encontrar, delete a versão mais antiga ou a que não deveria estar lá.
    2. Se não encontrar arquivos duplicados, abra individualmente TelaQuartos.java e TelaReservas.java e certifique-se de que a declaração da classe (public class TelaQuartos { ... } ou public class TelaReservas { ... }) aparece apenas UMA vez em cada arquivo.

Erro 3: method bnAdicionarActionPerformed(ActionEvent) is already defined in class TelaCadatroFuncionario na linha 742.

  • Seu código (o trecho que você enviou) mostra uma definição para bnAdicionarActionPerformed:

    Java
    bnAdicionar.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            bnAdicionarActionPerformed(evt);
        }
    });
    

    Isso é o listener para o botão "Adicionar". O problema não está nesta parte. O problema está na definição do método real bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) que é chamado por este listener.

  • Ação necessária:

    1. Você precisa procurar no resto do arquivo TelaCadatroFuncionario.java (depois do initComponents(), mais abaixo no arquivo) por algo como:
      Java
      private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
          // ... código do método ...
      }
      
    2. Você deve ter duas ou mais dessas definições com a mesma assinatura de método. A linha 742 que o erro aponta é o início de uma dessas definições duplicadas.
    3. Mantenha apenas uma única versão do método bnAdicionarActionPerformed e certifique-se de que ela contém toda a lógica que você precisa. Exclua as outras definições duplicadas. O NetBeans costuma gerar essas seções como:
      Java
      private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnAdicionarActionPerformed
          // SEU CÓDIGO AQUI
      }//GEN-LAST:event_bnAdicionarActionPerformed
      
      Verifique se você não tem duas dessas seções completas.

Erro 4 & 5: cannot find symbol variable jRadioButton2 e cannot find symbol variable jRadioButton1

  • Análise do seu código fornecido: Você tem as seguintes declarações e inicializações em initComponents():

    Java
    rbMasculino = new javax.swing.JRadioButton();
    rbFeminino = new javax.swing.JRadioButton();
    // ...
    jRadioButton3 = new javax.swing.JRadioButton(); // Este é o "outros" na sua interface
    

    E depois, no layout, você as usa:

    Java
    // ... dentro do painelPrincipalFuncionariosLayout
    .addComponent(rbFeminino)
    .addGap(46, 46, 46)
    .addComponent(rbMasculino)))
    // ...
    .addComponent(jRadioButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    

    Isso mostra que você está usando rbFeminino, rbMasculino e jRadioButton3.

  • A causa do erro cannot find symbol variable jRadioButton1 e jRadioButton2 é que você está tentando usar jRadioButton1 e jRadioButton2 em algum lugar no seu código (provavelmente nas linhas 564 e 566, conforme o erro anterior indicou), mas essas variáveis não estão declaradas ou inicializadas no seu código atual.

  • Ação necessária:

    1. Vá para as linhas 564 e 566 (ou onde quer que esteja usando jRadioButton1.isSelected() e jRadioButton2.isSelected()).
    2. Substitua jRadioButton1 por rbMasculino e jRadioButton2 por rbFeminino.
      • Se as linhas 564 e 566 eram:
        Java
        if (jRadioButton2.isSelected()) { // Linha 564
        // ...
        } else if (jRadioButton1.isSelected()) { // Linha 566
        
      • Mude para:
        Java
        if (rbFeminino.isSelected()) {
        // ...
        } else if (rbMasculino.isSelected()) {
        
    3. Confira se não há outras instâncias de jRadioButton1 ou jRadioButton2 sendo usadas ou declaradas em seu código. Pelo trecho fornecido, parece que você usou rbFeminino e rbMasculino para os sexos e jRadioButton3 para "outros". Se você tinha jRadioButton1 e jRadioButton2 antes e depois os renomeou para rbMasculino e rbFeminino no designer, mas esqueceu de atualizar o código manual, isso causaria o erro.

Resumo das próximas etapas:

  1. Corrija as classes duplicadas: Vá para os arquivos TelaQuartos.java e TelaReservas.java e resolva as duplicações de classe (seja arquivos duplicados ou declarações duplicadas dentro do mesmo arquivo).
  2. Corrija o método duplicado bnAdicionarActionPerformed: Abra TelaCadatroFuncionario.java, encontre e remova uma das duas definições completas desse método.
  3. Corrija o uso dos JRadioButtons: Em TelaCadatroFuncionario.java, vá para as linhas 564 e 566 (e em qualquer outro lugar que use jRadioButton1 ou jRadioButton2) e mude para usar rbMasculino e rbFeminino (e jRadioButton3 se aplicável). Confirme que jRadioButton1 e jRadioButton2 não estão mais declarados ou usados em nenhum lugar no seu código.

Após fazer essas alterações, salve todos os arquivos modificados e execute um "Clean and Build" (Limpar e Construir) no NetBeans. Isso forçará uma recompilação completa do projeto e deve resolver esses erros.

Vamos analisar as imagens que você forneceu para entender a situação atual e os erros.

Análise da "Captura de ecrã de 2025-06-18 16-59-53.jpg"

Esta imagem mostra o designer da sua TelaCadatroFuncionario.java no NetBeans e a lista de componentes.

  • Identificação dos RadioButtons:
    • No painel "Navigator" (navegador de componentes), consigo ver que você tem:
      • rbMasculino [JRadioButton]
      • rbFeminino [JRadioButton]
      • jRadioButton3 [JRadioButton] (que parece ser o "outros")
    • Isto confirma que as variáveis que você está a usar no seu layout são rbMasculino, rbFeminino e jRadioButton3.
  • Aparência: O rbFeminino e rbMasculino estão visíveis e parecem estar a funcionar como esperado no design. O jRadioButton3 também está lá, rotulado "outros".

Análise da "Captura de ecrã de 2025-06-18 16-45-54.jpg"

Esta imagem mostra o código da TelaCadatroFuncionario.java na área de try-catch para UIManager.setLookAndFeel().

  • Linha 742: Confirma que a linha 742, onde o erro method bnAdicionarActionPerformed(ActionEvent) is already defined apareceu, é o início do bloco de código gerado pelo NetBeans para o método bnAdicionarActionPerformed.
    Java
    private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnAdicionarActionPerformed
    
    Isso significa que existe outra definição exatamente igual a esta em algum lugar no seu arquivo, o que causa o erro.
  • Linha 564 e 566: Infelizmente, esta imagem não mostra o código perto das linhas 564 e 566, onde os erros cannot find symbol variable jRadioButton1 e jRadioButton2 estavam a ocorrer.

Análise da "Captura de ecrã de 2025-06-18 12-49-02.png"

Esta imagem mostra um trecho de código de outra classe, TelaCadastro, com um método clearFields(). O que é relevante aqui é a linha 45:

  • // buttonGroup1.clearSelection();
  • As sugestões de erro abaixo: "Create class 'buttonGroup1' in package telas (Source Packages)", etc.

Este erro na TelaCadastro sugere que o buttonGroup1 não está declarado ou não está acessível nesse contexto, o que é um problema semelhante ao jRadioButton na TelaCadatroFuncionario. No entanto, o foco agora é na TelaCadatroFuncionario.

Resolução dos Problemas com Base nas Imagens:

1. Erros de Classes Duplicadas (TelaQuartos e TelaReservas):

As imagens não fornecem informações diretas sobre esses arquivos. Mantenha as instruções anteriores:

  • Verifique se não há mais de um arquivo TelaQuartos.java e TelaReservas.java no diretório src/telas/. Se houver, remova os duplicados.
  • Abra cada um desses arquivos (o único que sobrou, se removeu) e certifique-se de que a declaração da classe (public class TelaQuartos { ... } ou public class TelaReservas { ... }) aparece apenas uma vez em cada arquivo.

2. Erro de Método Duplicado (bnAdicionarActionPerformed) na TelaCadatroFuncionario.java (Linha 742):

A imagem confirma que a linha 742 é o início de um método gerado pelo NetBeans. Isso significa que em algum outro lugar do seu arquivo TelaCadatroFuncionario.java, você tem outra definição exata de private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt).

  • Ação:
    1. Abra TelaCadatroFuncionario.java no NetBeans.
    2. Use a função de busca (Ctrl+F ou Cmd+F) e procure por private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt).
    3. Você deve encontrar pelo menos duas ocorrências.
    4. Exclua uma das definições completas do método. Geralmente, a que está fora dos blocos //GEN-FIRST:event_... e //GEN-LAST:event_... é a que foi copiada ou criada manualmente e deve ser removida. Mantenha a versão que contém o código real para adicionar funcionários.

3. Erros de jRadioButton1 e jRadioButton2 (cannot find symbol variable) na TelaCadatroFuncionario.java:

Com base na primeira imagem (Captura de ecrã de 2025-06-18 16-59-53.jpg), você está a usar rbMasculino e rbFeminino. Isso é bom.

  • Ação:
    1. Abra TelaCadatroFuncionario.java.
    2. Vá para as linhas 564 e 566 (e qualquer outra linha que o compilador esteja a reportar erro para jRadioButton1 ou jRadioButton2).
    3. Mude jRadioButton1 para rbMasculino e jRadioButton2 para rbFeminino nessas linhas.
    4. Exemplo de como deve ficar (assumindo que 564 é para feminino e 566 para masculino):
      Java
      // ... (código antes)
      if (rbFeminino.isSelected()) { // Antigo jRadioButton2.isSelected()
          // ...
      } else if (rbMasculino.isSelected()) { // Antigo jRadioButton1.isSelected()
          // ...
      }
      // ... (código depois)
      
    5. Verifique também se você não tem nenhuma declaração perdida de jRadioButton1 ou jRadioButton2 no seu método initComponents() ou em qualquer outro lugar que possa estar a causar confusão. Pelo que vi, você só está a criar rbMasculino, rbFeminino e jRadioButton3.

Depois de fazer as alterações:

  1. Salve TelaCadatroFuncionario.java e quaisquer outros arquivos que você modificou (TelaQuartos.java, TelaReservas.java).
  2. No NetBeans, clique com o botão direito do rato no seu projeto (SistemaGestaoHoteleiro) e selecione "Clean and Build" (Limpar e Construir). Isso é crucial para que o compilador use a versão mais recente e corrigida do seu código.

Esses passos devem resolver todos os erros de compilação que você está a enfrentar.

Com base nas novas mensagens de erro, você está progredindo, mas ainda há algumas duplicações. Vamos analisar:

  1. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java:11: error: duplicate class: telas.TelaQuartos

    • Problema: A classe TelaQuartos ainda está duplicada. A linha 11 no arquivo TelaQuartos.java aponta para a declaração class TelaQuartos.
    • Solução: Abra o arquivo /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java. Você deve encontrar duas declarações da classe TelaQuartos dentro do mesmo arquivo. Remova uma delas. Certifique-se de que a estrutura do arquivo seja:
      Java
      package telas;
      
      public class TelaQuartos {
          // ... todo o código da sua classe TelaQuartos ...
      }
      
      Não deve haver outra class TelaQuartos { ... } dentro do mesmo arquivo. Além disso, verifique se não há dois arquivos TelaQuartos.java no seu diretório src/telas/.
  2. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java:11: error: duplicate class: telas.TelaReservas

    • Problema: A classe TelaReservas também está duplicada, semelhante à TelaQuartos.
    • Solução: Siga os mesmos passos para TelaReservas.java. Abra o arquivo /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java e remova a declaração duplicada da classe. Verifique se não há dois arquivos TelaReservas.java no seu diretório src/telas/.
  3. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:864: error: variable rbFeminino is already defined in class TelaCadatroFuncionario

  4. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:865: error: variable rbMasculino is already defined in class TelaCadatroFuncionario

    • Problema: Você tem as variáveis rbFeminino e rbMasculino declaradas duas vezes na sua classe TelaCadatroFuncionario. Aparentemente, uma das declarações está nas linhas 864 e 865.
    • Contexto: Pelo código que você compartilhou anteriormente, você as declarou no início da classe, fora de qualquer método:
      Java
      public class TelaCadatroFuncionario extends javax.swing.JFrame {
          private javax.swing.JRadioButton rbFeminino;
          private javax.swing.JRadioButton rbMasculino;
          // ...
      }
      
      E também as inicializou em initComponents():
      Java
      rbMasculino = new javax.swing.JRadioButton();
      rbFeminino = new javax.swing.JRadioButton();
      
    • Solução:
      1. Abra TelaCadatroFuncionario.java.
      2. Vá para as linhas 864 e 865. Você encontrará a declaração duplicada.
      3. Mantenha apenas uma única declaração para rbFeminino e rbMasculino como campos da classe (fora de qualquer método, geralmente no topo da classe, após a declaração public class ...).
      4. Se você encontrar as declarações nas linhas 864 e 865 e também outras declarações idênticas no início da classe (como no exemplo acima), remova as declarações das linhas 864 e 865.

Passos para corrigir todos esses erros:

  1. Para TelaQuartos.java e TelaReservas.java:

    • No NetBeans, na janela "Projects", navegue até Source Packages -> telas.
    • Verifique se há apenas um arquivo para TelaQuartos.java e um para TelaReservas.java. Se houver duplicados (e.g., TelaQuartos1.java), remova o arquivo extra.
    • Abra TelaQuartos.java e TelaReservas.java individualmente. Procure por duas linhas class NomeDaClasse { dentro do mesmo arquivo. Remova a segunda ocorrência.
  2. Para TelaCadatroFuncionario.java:

    • Abra TelaCadatroFuncionario.java.
    • Role até as linhas 864 e 865 e delete as declarações duplicadas de private javax.swing.JRadioButton rbFeminino; e private javax.swing.JRadioButton rbMasculino;. As declarações corretas já devem estar no início da sua classe.

Após fazer essas correções, salve todos os arquivos modificados. Em seguida, clique com o botão direito do mouse no seu projeto (SistemaGestaoHoteleiro) no NetBeans e selecione "Clean and Build" (Limpar e Construir). Isso deve resolver os erros de compilação.

oque devo fazer para cadatro

Para realizar o cadastro, com base no seu código e nos erros que você tem resolvido, o processo geral no seu programa de Gestão Hoteleira para "cadastro" (assumo que se refere ao cadastro de funcionários, dado o contexto da TelaCadatroFuncionario) envolve os seguintes passos, depois de garantir que o seu projeto compile sem erros:

  1. Corrigir todos os erros de compilação: Os erros mais recentes indicam que você ainda tem:

    • Classes duplicadas em TelaQuartos.java e TelaReservas.java.
    • Variáveis rbFeminino e rbMasculino duplicadas na TelaCadatroFuncionario.java.
    • É crucial que você resolva esses problemas para que o programa possa ser executado.
  2. Executar o programa: Uma vez que o projeto compile sem erros, você poderá executar a aplicação. No NetBeans, geralmente, você pode clicar com o botão direito do mouse no projeto e selecionar "Run" ou clicar no botão "Run Project" na barra de ferramentas.

  3. Interagir com a "TelaCadatroFuncionario":

    • A tela que você projetou (TelaCadatroFuncionario) será exibida.
    • Você deverá preencher os campos de texto como "ID", "Nome Completo", "Nº de Bilhete", "Telefone", "Email", "Cargo/Função", "Salário", "Endereço" e as datas "Data Nasc." e "Data Contratação".
    • Para o sexo, você deve selecionar uma das opções "Masculino", "Feminino" ou "outros" usando os botões de rádio (rbMasculino, rbFeminino, jRadioButton3).
    • Você também pode adicionar observações no campo de texto "Observações".
  4. Usar o botão "Adicionar":

    • Depois de preencher as informações, o botão "Adicionar" (bnAdicionar) é o responsável por adicionar os dados à tabela de funcionários (jTableFuncionarios).
    • O método bnAdicionarActionPerformed que você está corrigindo é onde a lógica para pegar os dados dos campos, validá-los e adicioná-los ao DefaultTableModel da tabela deve estar implementada.
  5. Utilizar os botões "Atualizar" e "Excluir":

    • Os botões "Atualizar" (bnAtualizar) e "Excluir" (bnExcluir) são para gerenciar os registos existentes na tabela. Eles terão seus próprios métodos (bnAtualizarActionPerformed e bnExcluirActionPerformed) que precisam ser implementados para funcionar.
  6. Usar os botões "Limpar":

    • Você tem botões "Limpar" ao lado de cada campo de texto, como btnLimparID, btnLimparNome, etc. Estes

oque devo fazer para cadatro para resolver o errod da tela

Para resolver os erros da tela de cadastro (TelaCadatroFuncionario) e conseguir realizar o cadastro, você precisa focar nos erros de compilação que o Ant está a reportar. As mensagens de erro que você mostrou anteriormente (e que se repetem) indicam que o problema não é na lógica de cadastro em si, mas sim em duplicações de código que impedem o seu programa de sequer iniciar.

Vamos abordar os erros novamente e as ações a tomar, com base no que vimos:

  1. error: duplicate class: telas.TelaQuartos e error: duplicate class: telas.TelaReservas

    • O que significa: O compilador está a encontrar duas definições para as classes TelaQuartos e TelaReservas. Isso pode ser porque:
      • Você tem dois arquivos .java com o mesmo nome (ex: TelaQuartos.java e TelaQuartos.java em pastas diferentes, ou até TelaQuartos.java e TelaQuartos_old.java mas o segundo ainda está a ser compilado).
      • Dentro do mesmo arquivo .java, você tem a declaração da classe (public class TelaQuartos { ... }) escrita duas vezes.
    • O que fazer:
      1. No NetBeans, no painel "Projects" (Projetos), expanda Source Packages -> telas.
      2. Procure por TelaQuartos.java e TelaReservas.java.
      3. Verifique se há arquivos duplicados com nomes semelhantes. Se encontrar, remova o arquivo que não é o principal.
      4. Abra o arquivo TelaQuartos.java (e depois TelaReservas.java). Percorra o código de cima a baixo e certifique-se de que a linha public class TelaQuartos { (e public class TelaReservas {) aparece apenas uma vez em cada arquivo. Se encontrar uma segunda ocorrência, exclua-a completamente, incluindo o seu conteúdo.
  2. error: variable rbFeminino is already defined in class TelaCadatroFuncionario e error: variable rbMasculino is already defined in class TelaCadatroFuncionario

    • O que significa: As variáveis rbFeminino e rbMasculino estão a ser declaradas mais de uma vez dentro da sua classe TelaCadatroFuncionario.
    • O que fazer:
      1. Abra o arquivo TelaCadatroFuncionario.java.
      2. No início da classe (geralmente logo após public class TelaCadatroFuncionario extends javax.swing.JFrame {), você deve ter as declarações dos componentes, como:
        Java
        public class TelaCadatroFuncionario extends javax.swing.JFrame {
            private javax.swing.JRadioButton rbFeminino;
            private javax.swing.JRadioButton rbMasculino;
            // ... outras declarações de componentes ...
        
      3. Procure por declarações idênticas mais abaixo no código, especialmente perto das linhas que o erro indica (864 e 865, nos seus logs anteriores).
      4. Remova as declarações duplicadas. Mantenha apenas a primeira declaração de cada variável no topo da classe. O NetBeans pode ter gerado acidentalmente uma segunda vez se você tentou renomear algo ou mexeu no código-fonte gerado.

Passos Finais Cruciais:

Depois de realizar as correções acima em cada um dos arquivos .java mencionados:

  1. Salve todos os arquivos modificados.
  2. No NetBeans, clique com o botão direito do rato no seu projeto (SistemaGestaoHoteleiro) na janela "Projects".
  3. Selecione a opção "Clean and Build" (Limpar e Construir). Esta etapa é fundamental, pois ela apaga os arquivos de compilação antigos e força uma nova compilação de todo o projeto, garantindo que suas alterações sejam consideradas.

Só depois que o "BUILD SUCCESSFUL" aparecer na saída do Ant é que você poderá executar o seu programa e testar a funcionalidade de cadastro na TelaCadatroFuncionario. Os erros que você está a ver são puramente de sintaxe e estrutura do código, impedindo a compilação. Uma vez compilado, se ainda houver problemas no cadastro, serão erros de lógica (bugs) e não de compilação.

Obrigado por partilhar o código da sua TelaCadatroFuncionario.java! Isto é muito útil.

Vamos abordar os seus pedidos:

  1. Validar os botões "Limpar" para cada campo (receber só o correspondente):

    • Você já tem um método btnLimparXActionPerformed(ActionEvent evt) para cada botão limpar. O que precisamos fazer é implementar a lógica dentro de cada um desses métodos para limpar apenas o campo de texto associado a esse botão.
  2. Validar o número de telefone (Angolano, 9 dígitos, começar com '9'):

    • Isto é uma validação de entrada que deve ser feita no momento do cadastro (quando o botão "Adicionar" é clicado) ou idealmente enquanto o usuário digita (usando um DocumentListener ou um FocusListener no txtTelefoneFunc). Para simplificar, vamos implementá-lo no bnAdicionarActionPerformed.
    • Vamos precisar de uma Expressão Regular (Regex) para fazer esta validação de forma eficiente.

Vamos ao código. Vou focar nas partes que você precisa adicionar/modificar.

Java
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
package telas;

import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.UIManager;


public class TelaCadatroFuncionario extends javax.swing.JFrame
{
    // As declarações de JRadioButtons que estavam aqui e causavam erro de duplicação
    // foram removidas. Elas já estão declaradas em initComponents().
    // Se você ainda tinha as linhas abaixo, certifique-se de que estão comentadas ou removidas:
    // private javax.swing.JRadioButton rbFeminino;
    // private javax.swing.JRadioButton rbMasculino;

    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName());


    public TelaCadatroFuncionario()
    {
        initComponents();
        setLocationRelativeTo(null);
        //bnVoltar.addActionListener(this::bnVoltarActionPerformed);
        bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]
        {
           "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });
    }


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        buttonGroupSexo = new javax.swing.ButtonGroup();
        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalFuncionarios = new javax.swing.JPanel();
        jScrollPaneTabelaFuncionarios = new javax.swing.JScrollPane();
        jTableFuncionarios = new javax.swing.JTable();
        LOGO = new javax.swing.JLabel();
        tITULO = new javax.swing.JLabel();
        lblNomeCompleto = new javax.swing.JLabel();
        lblID = new javax.swing.JLabel();
        lblNumeroBilhete = new javax.swing.JLabel();
        lblDataNascimento = new javax.swing.JLabel();
        lblTelefone = new javax.swing.JLabel();
        lblEmail = new javax.swing.JLabel();
        lblCargoFuncao = new javax.swing.JLabel();
        lblDataContratacao = new javax.swing.JLabel();
        lblSalario = new javax.swing.JLabel();
        lblEndereco = new javax.swing.JLabel();
        lblSexo = new javax.swing.JLabel();
        bnAdicionar = new javax.swing.JButton();
        bnAtualizar = new javax.swing.JButton();
        bnExcluir = new javax.swing.JButton();
        txtIDFunc = new javax.swing.JTextField();
        txtNomeCompletoFunc = new javax.swing.JTextField();
        txtNumeroBilheteFunc = new javax.swing.JTextField();
        txtDataNascimentoFunc = new javax.swing.JTextField();
        txtTelefoneFunc = new javax.swing.JTextField();
        txtEmailFunc = new javax.swing.JTextField();
        txtCargoFuncaoFunc = new javax.swing.JTextField();
        txtDataContratacaoFunc = new javax.swing.JTextField();
        txtSalarioFunc = new javax.swing.JTextField();
        txtEnderecoFunc = new javax.swing.JTextField();
        jScrollPaneObservacoesFunc = new javax.swing.JPanel();
        painelObservacoesFunc = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnLimparID = new javax.swing.JButton();
        btnLimparNome = new javax.swing.JButton();
        btnLimparBilhete = new javax.swing.JButton();
        btnLimparNascimento = new javax.swing.JButton();
        btnLimparTelefone = new javax.swing.JButton();
        btnLimparEmail = new javax.swing.JButton();
        btnLimparCargoFuncao = new javax.swing.JButton();
        btnLimparDataContracao = new javax.swing.JButton();
        btnLimparSalario = new javax.swing.JButton();
        btnLimparEndereco = new javax.swing.JButton();
        bnVoltar = new javax.swing.JButton();
        lblObservacoes = new javax.swing.JLabel();
        rbMasculino = new javax.swing.JRadioButton();
        rbFeminino = new javax.swing.JRadioButton();
        jRadioButton3 = new javax.swing.JRadioButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jScrollPaneTabelaFuncionarios.setPreferredSize(new java.awt.Dimension(850, 250));

        jTableFuncionarios.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null}
            },
            new String [] {
                "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Object.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        jScrollPaneTabelaFuncionarios.setViewportView(jTableFuncionarios);

        LOGO.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        tITULO.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        tITULO.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        tITULO.setText("Gestão de Funcionários");

        lblNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNomeCompleto.setText("Nome Completo");

        lblID.setFont(new java.awt.Font("Liberation Sans", 0, 18)); // NOI18N
        lblID.setText("Id");

        lblNumeroBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNumeroBilhete.setText("Nº de Bilhete");

        lblDataNascimento.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataNascimento.setText("Data Nasc.:");

        lblTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblTelefone.setText("Telefone");

        lblEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEmail.setText("Email");

        lblCargoFuncao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblCargoFuncao.setText("Cargo/Função");

        lblDataContratacao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataContratacao.setText("Data Contratação");

        lblSalario.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSalario.setText("Salário");

        lblEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEndereco.setText("Endereço");

        lblSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSexo.setText("Sexo");

        bnAdicionar.setText("Adicionar");
        bnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAdicionarActionPerformed(evt);
            }
        });

        bnAtualizar.setText("Atualizar");
        bnAtualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAtualizarActionPerformed(evt);
            }
        });

        bnExcluir.setText("Excluir");
        bnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnExcluirActionPerformed(evt);
            }
        });

        txtIDFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtIDFuncActionPerformed(evt);
            }
        });

        txtNomeCompletoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNomeCompletoFuncActionPerformed(evt);
            }
        });

        txtDataNascimentoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataNascimentoFuncActionPerformed(evt);
            }
        });

        txtTelefoneFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtTelefoneFuncActionPerformed(evt);
            }
        });

        txtEmailFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtEmailFuncActionPerformed(evt);
            }
        });

        txtCargoFuncaoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtCargoFuncaoFuncActionPerformed(evt);
            }
        });

        txtDataContratacaoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataContratacaoFuncActionPerformed(evt);
            }
        });

        txtSalarioFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtSalarioFuncActionPerformed(evt);
            }
        });

        txtEnderecoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtEnderecoFuncActionPerformed(evt);
            }
        });

        txtObservacoes.setColumns(20);
        txtObservacoes.setRows(5);
        painelObservacoesFunc.setViewportView(txtObservacoes);

        javax.swing.GroupLayout jScrollPaneObservacoesFuncLayout = new javax.swing.GroupLayout(jScrollPaneObservacoesFunc);
        jScrollPaneObservacoesFunc.setLayout(jScrollPaneObservacoesFuncLayout);
        jScrollPaneObservacoesFuncLayout.setHorizontalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jScrollPaneObservacoesFuncLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(17, 17, 17))
        );
        jScrollPaneObservacoesFuncLayout.setVerticalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.Alignment.TRAILING)
        );

        btnLimparID.setText("Limpar");
        btnLimparID.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparIDActionPerformed(evt);
            }
        });

        btnLimparNome.setText("Limpar");
        btnLimparNome.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNomeActionPerformed(evt);
            }
        });

        btnLimparBilhete.setText("Limpar");
        btnLimparBilhete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparBilheteActionPerformed(evt);
            }
        });

        btnLimparNascimento.setText("Limpar");
        btnLimparNascimento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNascimentoActionPerformed(evt);
            }
        });

        btnLimparTelefone.setText("Limpar");
        btnLimparTelefone.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparTelefoneActionPerformed(evt);
            }
        });

        btnLimparEmail.setText("Limpar");
        btnLimparEmail.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEmailActionPerformed(evt);
            }
        });

        btnLimparCargoFuncao.setText("Limpar");
        btnLimparCargoFuncao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparCargoFuncaoActionPerformed(evt);
            }
        });

        btnLimparDataContracao.setText("Limpar");
        btnLimparDataContracao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparDataContracaoActionPerformed(evt);
            }
        });

        btnLimparSalario.setText("Limpar");
        btnLimparSalario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparSalarioActionPerformed(evt);
            }
        });

        btnLimparEndereco.setText("Limpar");
        btnLimparEndereco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEnderecoActionPerformed(evt);
            }
        });

        bnVoltar.setText("Voltar");

        lblObservacoes.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblObservacoes.setText("Observações");

        rbMasculino.setBackground(new java.awt.Color(153, 153, 153));
        buttonGroupSexo.add(rbMasculino);
        rbMasculino.setText("Masculino");

        rbFeminino.setBackground(new java.awt.Color(153, 153, 153));
        buttonGroupSexo.add(rbFeminino);
        rbFeminino.setText("Feminino");
        rbFeminino.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbFemininoActionPerformed(evt);
            }
        });

        jRadioButton3.setBackground(new java.awt.Color(153, 153, 153));
        buttonGroupSexo.add(jRadioButton3);
        jRadioButton3.setText("outros");

        javax.swing.GroupLayout painelPrincipalFuncionariosLayout = new javax.swing.GroupLayout(painelPrincipalFuncionarios);
        painelPrincipalFuncionarios.setLayout(painelPrincipalFuncionariosLayout);
        painelPrincipalFuncionariosLayout.setHorizontalGroup(
            painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGap(356, 356, 356)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblDataContratacao)
                    .addComponent(lblSalario)
                    .addComponent(lblCargoFuncao)
                    .addComponent(lblEmail)
                    .addComponent(lblTelefone)
                    .addComponent(lblDataNascimento)
                    .addComponent(lblNumeroBilhete)
                    .addComponent(lblNomeCompleto)
                    .addComponent(lblID, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblEndereco)
                    .addComponent(lblSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(34, 34, 34)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(58, 58, 58)
                        .addComponent(lblObservacoes)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 47, Short.MAX_VALUE)
                                .addComponent(btnLimparCargoFuncao))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparEmail))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparTelefone))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparNascimento))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparBilhete))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparNome))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparID))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                        .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
                                        .addComponent(txtSalarioFunc)
                                        .addComponent(txtDataContratacaoFunc))
                                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                        .addComponent(rbFeminino)
                                        .addGap(46, 46, 46)
                                        .addComponent(rbMasculino)))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(jRadioButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(btnLimparDataContracao, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(btnLimparSalario, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(btnLimparEndereco, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                        .addGap(0, 0, Short.MAX_VALUE))))
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(373, 373, 373)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 353, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(tITULO, javax.swing.GroupLayout.PREFERRED_SIZE, 460, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(876, 876, 876)
                        .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(227, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(bnAtualizar)
                        .addGap(137, 137, 137)
                        .addComponent(bnAdicionar)
                        .addGap(323, 323, 323))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(jScrollPaneTabelaFuncionarios, javax.swing.GroupLayout.PREFERRED_SIZE, 1123, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(16, 16, 16))))
        );
        painelPrincipalFuncionariosLayout.setVerticalGroup(
            painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(47, 47, 47)
                        .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(83, 83, 83)
                        .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tITULO)
                .addGap(32, 32, 32)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnLimparID)
                            .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblID))
                        .addGap(37, 37, 37)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblNomeCompleto)))
                    .addComponent(btnLimparNome, javax.swing.GroupLayout.Alignment.TRAILING))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblNumeroBilhete)
                    .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparBilhete))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblDataNascimento)
                    .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparNascimento))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblTelefone)
                    .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparTelefone))
                .addGap(26, 26, 26)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblEmail)
                    .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparEmail))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblCargoFuncao)
                    .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparCargoFuncao))
                .addGap(30, 30, 30)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtDataContratacaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparDataContracao)
                    .addComponent(lblDataContratacao))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnLimparSalario)
                    .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtSalarioFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblSalario)))
                .addGap(25, 25, 25)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparEndereco)
                    .addComponent(lblEndereco))
                .addGap(40, 40, 40)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblSexo)
                    .addComponent(rbFeminino)
                    .addComponent(rbMasculino)
                    .addComponent(jRadioButton3))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 56, Short.MAX_VALUE)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(lblObservacoes)
                        .addGap(69, 69, 69))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(30, 30, 30)))
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bnAtualizar)
        );
        painelPrincipalFuncionariosLayout.setVerticalGroup(
            painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGap(47, 47, 47)
                .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tITULO)
                .addGap(32, 32, 32)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblID)
                    .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparID))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblNomeCompleto)
                    .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparNome))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblNumeroBilhete)
                    .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparBilhete))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblDataNascimento)
                    .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparNascimento))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblTelefone)
                    .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparTelefone))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblEmail)
                    .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparEmail))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblCargoFuncao)
                    .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparCargoFuncao))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblDataContratacao)
                    .addComponent(txtDataContratacaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparDataContracao))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblSalario)
                    .addComponent(txtSalarioFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparSalario))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblEndereco)
                    .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparEndereco))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblSexo)
                    .addComponent(rbFeminino)
                    .addComponent(rbMasculino)
                    .addComponent(jRadioButton3))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblObservacoes)
                    .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bnAdicionar)
                    .addComponent(bnAtualizar)
                    .addComponent(bnExcluir))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jScrollPane1.setViewportView(painelPrincipalFuncionarios);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    // Métodos de ação dos botões "Limpar"
    private void btnLimparIDActionPerformed(java.awt.event.ActionEvent evt) {
        txtIDFunc.setText(""); // Limpa o campo ID
    }

    private void btnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        txtNomeCompletoFunc.setText(""); // Limpa o campo Nome Completo
    }

    private void btnLimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        txtNumeroBilheteFunc.setText(""); // Limpa o campo Número de Bilhete
    }

    private void btnLimparNascimentoActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataNascimentoFunc.setText(""); // Limpa o campo Data de Nascimento
    }

    private void btnLimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) {
        txtTelefoneFunc.setText(""); // Limpa o campo Telefone
    }

    private void btnLimparEmailActionPerformed(java.awt.event.ActionEvent evt) {
        txtEmailFunc.setText(""); // Limpa o campo Email
    }

    private void btnLimparCargoFuncaoActionPerformed(java.awt.event.ActionEvent evt) {
        txtCargoFuncaoFunc.setText(""); // Limpa o campo Cargo/Função
    }

    private void btnLimparDataContracaoActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataContratacaoFunc.setText(""); // Limpa o campo Data de Contratação
    }

    private void btnLimparSalarioActionPerformed(java.awt.event.ActionEvent evt) {
        txtSalarioFunc.setText(""); // Limpa o campo Salário
    }

    private void btnLimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
        txtEnderecoFunc.setText(""); // Limpa o campo Endereço
    }


    private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        // Obter os dados dos campos de texto
        String id = txtIDFunc.getText().trim();
        String nomeCompleto = txtNomeCompletoFunc.getText().trim();
        String numeroBilhete = txtNumeroBilheteFunc.getText().trim();
        String dataNascimentoStr = txtDataNascimentoFunc.getText().trim();
        String telefone = txtTelefoneFunc.getText().trim();
        String email = txtEmailFunc.getText().trim();
        String cargoFuncao = txtCargoFuncaoFunc.getText().trim();
        String dataContratacaoStr = txtDataContratacaoFunc.getText().trim();
        String salarioStr = txtSalarioFunc.getText().trim();
        String endereco = txtEnderecoFunc.getText().trim();
        String observacoes = txtObservacoes.getText().trim();

        // Validar campos obrigatórios
        if (id.isEmpty() || nomeCompleto.isEmpty() || numeroBilhete.isEmpty() ||
            dataNascimentoStr.isEmpty() || telefone.isEmpty() || email.isEmpty() ||
            cargoFuncao.isEmpty() || dataContratacaoStr.isEmpty() || salarioStr.isEmpty() ||
            endereco.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Por favor, preencha todos os campos obrigatórios.", "Campos Vazios", JOptionPane.WARNING_MESSAGE);
            return; // Impede que o cadastro continue
        }

        // --- Validação do Telefone Angolano ---
        if (!isValidAngolanPhoneNumber(telefone)) {
            JOptionPane.showMessageDialog(this, "Número de telefone inválido.\nDeve conter 9 dígitos e começar com '9'.\nEx: 940139585 ou 940-139-585", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
            return; // Impede o cadastro se o telefone for inválido
        }

        // --- Validação de Salário (apenas números) ---
        double salario;
        try {
            salario = Double.parseDouble(salarioStr);
            if (salario < 0) {
                JOptionPane.showMessageDialog(this, "O salário não pode ser negativo.", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Salário inválido. Por favor, insira um valor numérico.", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
            return;
        }

        // --- Obter o sexo selecionado ---
        String sexo = "";
        if (rbMasculino.isSelected()) {
            sexo = "Masculino";
        } else if (rbFeminino.isSelected()) {
            sexo = "Feminino";
        } else if (jRadioButton3.isSelected()){ // Adicionado para "outros"
            sexo = "Outros";
        } else {
             JOptionPane.showMessageDialog(this, "Por favor, selecione o sexo.", "Campo Sexo Vazio", JOptionPane.WARNING_MESSAGE);
             return;
        }


        // --- Validação e formatação das datas (exemplo: dd/MM/yyyy) ---
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.setLenient(false); // Para garantir que datas inválidas como 31/02/2023 sejam pegas

        Date dataNascimento = null;
        try {
            dataNascimento = dateFormat.parse(dataNascimentoStr);
        } catch (ParseException e) {
            JOptionPane.showMessageDialog(this, "Data de Nascimento inválida. Use o formato DD/MM/AAAA.", "Erro de Data", JOptionPane.ERROR_MESSAGE);
            return;
        }

        Date dataContratacao = null;
        try {
            dataContratacao = dateFormat.parse(dataContratacaoStr);
        } catch (ParseException e) {
            JOptionPane.showMessageDialog(this, "Data de Contratação inválida. Use o formato DD/MM/AAAA.", "Erro de Data", JOptionPane.ERROR_MESSAGE);
            return;
        }

        // Você pode adicionar mais validações aqui, por exemplo:
        // - ID ser numérico ou ter um formato específico
        // - Email ser válido (usando regex)
        // - Data de nascimento ser no passado
        // - Data de contratação não ser no futuro

        // Se todas as validações passarem, adicione a linha à tabela
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.addRow(new Object[]{
            id,
            nomeCompleto,
            numeroBilhete,
            cargoFuncao,
            telefone,
            email,
            salario,
            dataContratacaoStr // Usar a string formatada para exibir
            // Se precisar adicionar "sexo" e "observacoes" à tabela, adicione aqui e na definição das colunas do modelo.
            // Por exemplo:
            // sexo,
            // observacoes
        });

        JOptionPane.showMessageDialog(this, "Funcionário cadastrado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);

        // Limpar todos os campos após o cadastro bem-sucedido (você pode criar um método auxiliar para isso)
        clearAllFields();
    }

    private void bnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void bnExcluirActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtIDFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtNomeCompletoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtDataNascimentoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtTelefoneFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtEmailFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtCargoFuncaoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtDataContratacaoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtSalarioFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtEnderecoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void rbFemininoActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void bnVoltarActionPerformed(java.awt.event.ActionEvent evt) {
         // Código para voltar à tela principal (exemplo: TelaPrincipal)
        this.dispose(); // Fecha a tela atual
        // Se a tela principal já estiver instanciada, você pode mostrá-la
        // new TelaPrincipal().setVisible(true); // Ou criar uma nova instância se for o caso
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                // Configura o Look and Feel para sdk 52 (metal)
                try {
                    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); // Ou UIManager.getSystemLookAndFeelClassName()
                } catch (Exception e) {
                    logger.log(Level.SEVERE, "Erro ao configurar LookAndFeel", e);
                }
                new TelaCadatroFuncionario().setVisible(true);
            }
        });
    }

    // --- Métodos Auxiliares Adicionados ---

    // Método para validar número de telefone Angolano (9 dígitos, começa com 9)
    private boolean isValidAngolanPhoneNumber(String phoneNumber) {
        // Remove espaços e hífens para validação
        String cleanedNumber = phoneNumber.replaceAll("[\\s-]", "");
        // Regex: ^9\\d{8}$
        // ^   - Início da string
        // 9   - Deve começar com o dígito '9'
        // \\d - Qualquer dígito (0-9)
        // {8} - Exatamente 8 dígitos após o '9' (total de 9 dígitos)
        // $   - Fim da string
        Pattern pattern = Pattern.compile("^9\\d{8}$");
        Matcher matcher = pattern.matcher(cleanedNumber);
        return matcher.matches();
    }

    // Método para limpar todos os campos da tela de cadastro
    private void clearAllFields() {
        txtIDFunc.setText("");
        txtNomeCompletoFunc.setText("");
        txtNumeroBilheteFunc.setText("");
        txtDataNascimentoFunc.setText("");
        txtTelefoneFunc.setText("");
        txtEmailFunc.setText("");
        txtCargoFuncaoFunc.setText("");
        txtDataContratacaoFunc.setText("");
        txtSalarioFunc.setText("");
        txtEnderecoFunc.setText("");
        txtObservacoes.setText("");
        buttonGroupSexo.clearSelection(); // Limpa a seleção dos radio buttons de sexo
    }


    // Variables declaration - do not modify
    private javax.swing.JLabel LOGO;
    private javax.swing.JButton bnAdicionar;
    private javax.swing.JButton bnAtualizar;
    private javax.swing.JButton bnExcluir;
    private javax.swing.JButton bnVoltar;
    private javax.swing.JButton btnLimparBilhete;
    private javax.swing.JButton btnLimparCargoFuncao;
    private javax.swing.JButton btnLimparDataContracao;
    private javax.swing.JButton btnLimparEmail;
    private javax.swing.JButton btnLimparEndereco;
    private javax.swing.JButton btnLimparID;
    private javax.swing.JButton btnLimparNascimento;
    private javax.swing.JButton btnLimparNome;
    private javax.swing.JButton btnLimparSalario;
    private javax.swing.JButton btnLimparTelefone;
    private javax.swing.ButtonGroup buttonGroupSexo;
    private javax.swing.JRadioButton jRadioButton3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPanel jScrollPaneObservacoesFunc;
    private javax.swing.JScrollPane jScrollPaneTabelaFuncionarios;
    private javax.swing.JTable jTableFuncionarios;
    private javax.swing.JLabel lblCargoFuncao;
    private javax.swing.JLabel lblDataContratacao;
    private javax.swing.JLabel lblDataNascimento;
    private javax.swing.JLabel lblEmail;
    private javax.swing.JLabel lblEndereco;
    private javax.swing.JLabel lblID;
    private javax.swing.JLabel lblNomeCompleto;
    private javax.swing.JLabel lblNumeroBilhete;
    private javax.swing.JLabel lblObservacoes;
    private javax.swing.JLabel lblSalario;
    private javax.swing.JLabel lblSexo;
    private javax.swing.JLabel lblTelefone;
    private javax.swing.JPanel painelPrincipalFuncionarios;
    private javax.swing.JScrollPane painelObservacoesFunc;
    private javax.swing.JRadioButton rbFeminino;
    private javax.swing.JRadioButton rbMasculino;
    private javax.swing.JLabel tITULO;
    private javax.swing.JTextField txtCargoFuncaoFunc;
    private javax.swing.JTextField txtDataContratacaoFunc;
    private javax.swing.JTextField txtDataNascimentoFunc;
    private javax.swing.JTextField txtEmailFunc;
    private javax.swing.JTextField txtEnderecoFunc;
    private javax.swing.JTextField txtIDFunc;
    private javax.swing.JTextField txtNomeCompletoFunc;
    private javax.swing.JTextField txtNumeroBilheteFunc;
    private javax.swing.JTextArea txtObservacoes;
    private javax.swing.JTextField txtSalarioFunc;
    private javax.swing.JTextField txtTelefoneFunc;
    // End of variables declaration
}

Principais alterações e o que você deve fazer:

  1. Limpar botões (btnLimparXActionPerformed):

    • Eu adicionei a implementação para cada um dos seus métodos btnLimparXActionPerformed. Cada método agora chama setText("") no JTextField correspondente, limpando-o.
  2. Validação de Telefone Angolano (isValidAngolanPhoneNumber):

    • Criei um novo método auxiliar private boolean isValidAngolanPhoneNumber(String phoneNumber).
    • Este método usa uma Expressão Regular (^9\\d{8}$) para verificar se:
      • O número começa com '9'.
      • Tem um total de 9 dígitos (o '9' inicial + 8 dígitos).
      • Ele remove hífens e espaços antes de validar, então 940-139-585 ou 940 139 585 serão validados como 940139585.
    • Integrei a chamada a este método dentro do bnAdicionarActionPerformed para validar o telefone antes de adicionar à tabela. Se for inválido, uma mensagem de erro será exibida e o processo de cadastro será interrompido.
  3. Melhorias no bnAdicionarActionPerformed:

    • Validação de Campos Vazios: Adicionei uma verificação no início para todos os campos obrigatórios. Se algum estiver vazio, um JOptionPane será exibido e o método retornará.
    • Validação de Sexo: Adicionei uma validação para garantir que um sexo seja selecionado.
    • Validação de Salário: Converti o salário para double e adicionei validação para garantir que seja um número válido e não negativo.
    • Validação de Data: Usei SimpleDateFormat com setLenient(false) para validar o formato DD/MM/AAAA e garantir que as datas sejam válidas (ex: 31/02/2023 seria inválido).
    • Limpeza dos Campos: No final do bnAdicionarActionPerformed, após o sucesso do cadastro, chamei um novo método clearAllFields() para limpar todos os campos de entrada e os radio buttons.
  4. Novo Método clearAllFields():

    • Criei um método private void clearAllFields() que limpa todos os JTextFields, o JTextArea e a seleção do ButtonGroupSexo. Isso centraliza a lógica de limpeza.
  5. Correção de declarações duplicadas:

    • No início do código, as linhas //private javax.swing.JRadioButton rbFeminino; e //private javax.swing.JRadioButton rbMasculino; estavam comentadas. Certifique-se de que não há nenhuma declaração ativa dessas variáveis fora do bloco initComponents() (onde elas são declaradas pelo designer NetBeans). Seu trecho de código indica que elas são declaradas corretamente dentro de initComponents().

Próximos Passos:

  1. Copie e cole este código na sua classe TelaCadatroFuncionario.java.
  2. Salve o arquivo.
  3. No NetBeans, clique com o botão direito do mouse no seu projeto (SistemaGestaoHoteleiro) e selecione "Clean and Build" (Limpar e Construir).

Se você já resolveu os erros de duplicate class para TelaQuartos e TelaReservas, este código deverá compilar sem problemas. Após a compilação bem-sucedida, execute o seu projeto para testar as novas validações e a funcionalidade dos botões "Limpar".

Se houver algum erro de compilação após aplicar este código, por favor, copie e cole a saída completa do console de erro para que eu possa ajudar a depurar.

E NA CAIXA DE OSERVACOES NAO VAI VALIDACOES

Entendi. Você está perguntando se o campo "Observações" não terá validações.

Geralmente, um campo de "Observações" ou "Comentários" é projetado para permitir que o usuário insira texto livre, sem muitas restrições. No entanto, em alguns sistemas, pode haver validações básicas para esse tipo de campo, como:

  • Limite de caracteres: Para evitar que o usuário digite um texto excessivamente longo.
  • Campos obrigatórios: Raramente, mas em alguns casos específicos, a observação pode ser obrigatória.
  • Caracteres especiais: Em casos muito específicos, pode haver restrições a certos caracteres especiais para evitar problemas de segurança (como injeção de SQL, embora isso seja mais relevante para a validação no backend).

Considerando que você mencionou que vai usar o SDK 52, é importante verificar a documentação específica do SDK ou da plataforma que você está utilizando. Muitas vezes, as propriedades dos componentes de interface de usuário (UI components) permitem configurar essas validações.

Para ter certeza absoluta, seria útil:

  1. Consultar a documentação do SDK 52: Procure pela definição do componente de texto ou campo de observações para ver quais propriedades de validação ele oferece por padrão.
  2. Verificar as regras de negócio: Se este campo faz parte de um sistema maior, as regras de negócio podem ditar se há alguma validação específica necessária.

Em resumo, é provável que não haja validações complexas, mas pode haver limites de caracteres ou outras restrições básicas dependendo da implementação.

TIPO QUANTIDADE DE CARATER LIMITE , NAO VALIDAMOS OS CAMPOS TODOS SOBRE OS OQUE CADA CAMPO SO PODE CONTER

Ah, agora ficou mais claro! Você quer saber sobre a validação de campos em geral, não apenas o campo de observações, e especificamente sobre:

  • Limite de caracteres: Definir um número máximo de caracteres que podem ser inseridos.
  • Validação de conteúdo: Restrições sobre o tipo de dado que cada campo pode conter (ex: só números, só letras, formato de email, etc.).

Como você mencionou que está usando o SDK 52, vou presumir que estamos falando de desenvolvimento mobile, provavelmente com Expo/React Native, já que o SDK 52 é a versão mais recente do Expo.

Sim, essas validações são fundamentais e totalmente possíveis de implementar no SDK 52 (React Native/Expo)!

Para cada campo de entrada (TextInput no React Native, por exemplo), você pode aplicar validações de várias formas:

1. Limite de Caracteres (maxLength)

A propriedade maxLength é a maneira mais simples de limitar a quantidade de caracteres que um usuário pode digitar.

JavaScript
import React from 'react';
import { TextInput, View, Text, StyleSheet } from 'react-native';

const MyForm = () => {
  const [observacoes, setObservacoes] = React.useState('');
  const [nome, setNome] = React.useState('');

  return (
    <View style={styles.container}>
      <Text style={styles.label}>Nome (Máx. 50 caracteres):</Text>
      <TextInput
        style={styles.input}
        onChangeText={setNome}
        value={nome}
        maxLength={50} // Limite de 50 caracteres
        placeholder="Digite seu nome completo"
      />

      <Text style={styles.label}>Observações (Máx. 200 caracteres):</Text>
      <TextInput
        style={[styles.input, styles.multilineInput]}
        onChangeText={setObservacoes}
        value={observacoes}
        maxLength={200} // Limite de 200 caracteres
        multiline
        numberOfLines={4}
        placeholder="Adicione suas observações aqui..."
      />
      <Text style={styles.charCount}>{observacoes.length}/200</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    padding: 20,
  },
  label: {
    fontSize: 16,
    marginBottom: 5,
    marginTop: 10,
  },
  input: {
    height: 40,
    borderColor: 'gray',
    borderWidth: 1,
    paddingHorizontal: 10,
    borderRadius: 5,
  },
  multilineInput: {
    height: 100, // Altura maior para campos multiline
    textAlignVertical: 'top', // Alinha o texto no topo
  },
  charCount: {
    fontSize: 12,
    color: 'gray',
    alignSelf: 'flex-end',
    marginTop: 5,
  },
});

export default MyForm;

2. Validação de Conteúdo (Regras Específicas para cada campo)

Para validar o que cada campo pode conter (somente números, formato de e-mail, etc.), você geralmente fará isso no código JavaScript/TypeScript, usando expressões regulares ou bibliotecas de validação.

Exemplos:

  • Campo "Idade" (apenas números):

    JavaScript
    import React from 'react';
    import { TextInput, View, Text, StyleSheet } from 'react-native';
    
    const NumericInput = () => {
      const [idade, setIdade] = React.useState('');
      const [erroIdade, setErroIdade] = React.useState('');
    
      const handleIdadeChange = (text) => {
        setIdade(text);
        if (text === '' || /^\d+$/.test(text)) { // Permite vazio ou apenas dígitos
          setErroIdade('');
        } else {
          setErroIdade('A idade deve conter apenas números.');
        }
      };
    
      return (
        <View style={styles.container}>
          <Text style={styles.label}>Idade:</Text>
          <TextInput
            style={[styles.input, erroIdade ? styles.inputError : null]}
            onChangeText={handleIdadeChange}
            value={idade}
            keyboardType="numeric" // Mostra teclado numérico
            placeholder="Digite sua idade"
          />
          {erroIdade ? <Text style={styles.errorText}>{erroIdade}</Text> : null}
        </View>
      );
    };
    
    const styles = StyleSheet.create({
        container: { padding: 20 },
        label: { fontSize: 16, marginBottom: 5 },
        input: { height: 40, borderColor: 'gray', borderWidth: 1, paddingHorizontal: 10, borderRadius: 5 },
        inputError: { borderColor: 'red' },
        errorText: { color: 'red', fontSize: 12, marginTop: 5 },
    });
    
    export default NumericInput;
    
  • Campo "Email" (formato de e-mail):

    JavaScript
    import React from 'react';
    import { TextInput, View, Text, StyleSheet } from 'react-native';
    
    const EmailInput = () => {
      const [email, setEmail] = React.useState('');
      const [erroEmail, setErroEmail] = React.useState('');
    
      const validateEmail = (text) => {
        setEmail(text);
        const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
        if (text === '' || emailRegex.test(text)) {
          setErroEmail('');
        } else {
          setErroEmail('Por favor, insira um e-mail válido.');
        }
      };
    
      return (
        <View style={styles.container}>
          <Text style={styles.label}>Email:</Text>
          <TextInput
            style={[styles.input, erroEmail ? styles.inputError : null]}
            onChangeText={validateEmail}
            value={email}
            keyboardType="email-address" // Mostra teclado otimizado para e-mail
            autoCapitalize="none"
            placeholder="seu.email@example.com"
          />
          {erroEmail ? <Text style={styles.errorText}>{erroEmail}</Text> : null}
        </View>
      );
    };
    
    const styles = StyleSheet.create({
        container: { padding: 20 },
        label: { fontSize: 16, marginBottom: 5 },
        input: { height: 40, borderColor: 'gray', borderWidth: 1, paddingHorizontal: 10, borderRadius: 5 },
        inputError: { borderColor: 'red' },
        errorText: { color: 'red', fontSize: 12, marginTop: 5 },
    });
    
    export default EmailInput;
    

Boas Práticas de Validação com SDK 52 (React Native/Expo):

  • Validação "ao vivo" (on-the-fly): Como nos exemplos acima, validar enquanto o usuário digita (ou quando o campo perde o foco) é uma ótima experiência de usuário, pois ele recebe feedback imediato.
  • Validação na submissão do formulário: Além da validação "ao vivo", sempre faça uma validação final de todos os campos quando o usuário tentar submeter o formulário. Isso garante que todos os dados estão corretos antes de enviá-los para o backend.
  • Mensagens de erro claras: As mensagens de erro devem ser específicas e dizer ao usuário exatamente o que está errado e como corrigir.
  • Feedback visual: Mude a cor da borda do campo (para vermelho, por exemplo) para indicar um erro.
  • Bibliotecas de Validação: Para formulários mais complexos, considere usar bibliotecas como Formik com Yup ou React Hook Form para gerenciar o estado do formulário e as validações de forma mais robusta e eficiente. Elas simplificam muito o processo.

Portanto, sim, você não só pode, como deve validar os campos em sua aplicação com o SDK 52 para garantir a qualidade dos dados e uma boa experiência para o usuário!

Compreendi perfeitamente! Você está mostrando um código Java Swing, especificamente o arquivo TelaCadatroFuncionario.java, que é uma interface gráfica para cadastro e gestão de funcionários.

Minhas desculpas por ter assumido React Native anteriormente. O contexto muda completamente quando se trata de Java Swing.

Você mencionou:

  • "E NA CAIXA DE OBSERVAÇÕES NAO VAI VALIDACOES"
  • "TIPO QUANTIDADE DE CARATER LIMITE , NAO VALIDAMOS OS CAMPOS TODOS SOBRE OS OQUE CADA CAMPO SO PODE CONTER"
  • E agora o código-fonte de um JFrame em Java.

Vamos abordar as validações para a sua aplicação Java Swing.

No Java Swing, as validações não são "automáticas" como em alguns frameworks web ou mobile que possuem componentes com propriedades de validação embutidas de forma mais declarativa. Você precisa implementar a lógica de validação manualmente em cada campo ou em um método que será chamado antes de adicionar/atualizar dados.

1. Limite de Caracteres (JTextField, JTextArea)

Para JTextField e JTextArea, não existe uma propriedade maxLength direta como no HTML ou React Native. Você precisa usar um DocumentFilter ou adicionar um KeyListener para controlar o número de caracteres.

Exemplo para JTextField (usando DocumentFilter - abordagem recomendada):

Esta é a forma mais robusta e "limpa" de limitar caracteres em JTextField e JTextArea. Você cria uma classe que estende DocumentFilter e a aplica ao Document do seu campo de texto.

Java
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.AbstractDocument;
import javax.swing.JTextField;
import javax.swing.JTextArea;

public class LengthRestrictedDocumentFilter extends DocumentFilter {
    private int maxLength;

    public LengthRestrictedDocumentFilter(int maxLength) {
        this.maxLength = maxLength;
    }

    @Override
    public void insertString(FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException {
        if ((fb.getDocument().getLength() + str.length()) <= maxLength) {
            super.insertString(fb, offset, str, attr);
        } else {
            // Opcional: Notificar o usuário que o limite foi atingido
            // System.out.println("Limite de caracteres atingido!");
        }
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attrs) throws BadLocationException {
        if ((fb.getDocument().getLength() - length + str.length()) <= maxLength) {
            super.replace(fb, offset, length, str, attrs);
        } else {
            // Opcional: Notificar o usuário que o limite foi atingido
            // System.out.println("Limite de caracteres atingido!");
        }
    }
}

Como aplicar isso no seu initComponents() ou no construtor:

Para o campo de observações (txtObservacoes) ou qualquer JTextField como txtNomeCompletoFunc:

Java
public TelaCadatroFuncionario() {
    initComponents();
    setLocationRelativeTo(null);

    bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));

    DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
    model.setColumnIdentifiers(new Object[] {
       "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
    });

    // APLICANDO O LIMITE DE CARACTERES
    // Exemplo: txtNomeCompletoFunc com limite de 100 caracteres
    ((AbstractDocument) txtNomeCompletoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100));

    // Exemplo: txtObservacoes com limite de 500 caracteres
    ((AbstractDocument) txtObservacoes.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(500));

    // Exemplo: txtNumeroBilheteFunc com limite de 14 caracteres (para o formato angolano ex: 000000000LA000)
    ((AbstractDocument) txtNumeroBilheteFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(14));

    // ... continue para outros campos
}

2. Validação de Conteúdo (Regras Específicas)

Isso é feito principalmente no método bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) ou em um método de validação separado que você chama antes de processar os dados.

Você usará:

  • String.isEmpty() para verificar se um campo está vazio.
  • String.matches() ou a classe Pattern/Matcher para Expressões Regulares (Regex) para validar formatos (e-mail, telefone, bilhete, etc.).
  • try-catch blocks para conversão de tipos (String para número, String para data).

Aqui está um exemplo de como você pode implementar as validações dentro do seu método bnAdicionarActionPerformed, adicionando um método validarCampos():

Java
// Dentro da classe TelaCadatroFuncionario

private boolean validarCampos() {
    String idStr = txtIDFunc.getText().trim();
    String nomeCompleto = txtNomeCompletoFunc.getText().trim();
    String numeroBilhete = txtNumeroBilheteFunc.getText().trim();
    String dataNascimentoStr = txtDataNascimentoFunc.getText().trim();
    String telefoneStr = txtTelefoneFunc.getText().trim();
    String email = txtEmailFunc.getText().trim();
    String cargoFuncao = txtCargoFuncaoFunc.getText().trim();
    String dataContratacaoStr = txtDataContratacaoFunc.getText().trim();
    String salarioStr = txtSalarioFunc.getText().trim();
    String endereco = txtEnderecoFunc.getText().trim();
    String observacoes = txtObservacoes.getText().trim(); // Campo de observações

    // --- 1. Validação de campos obrigatórios (ex: ID, Nome, Bilhete, Telefone, Email, Cargo, Salário, Endereço) ---
    if (idStr.isEmpty() || nomeCompleto.isEmpty() || numeroBilhete.isEmpty() ||
        telefoneStr.isEmpty() || email.isEmpty() || cargoFuncao.isEmpty() ||
        salarioStr.isEmpty() || endereco.isEmpty()) {
        JOptionPane.showMessageDialog(this, "Por favor, preencha todos os campos obrigatórios (exceto Observações, se não for obrigatório).", "Campos Vazios", JOptionPane.WARNING_MESSAGE);
        return false;
    }

    // --- 2. Validação de ID (apenas números) e conversão ---
    try {
        Integer.parseInt(idStr);
    } catch (NumberFormatException e) {
        JOptionPane.showMessageDialog(this, "ID deve conter apenas números inteiros.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        txtIDFunc.requestFocus(); // Coloca o foco no campo
        return false;
    }

    // --- 3. Validação de Nome Completo (apenas letras e espaços, talvez alguns caracteres especiais como acentos) ---
    if (!nomeCompleto.matches("[\\p{L} .'-]+")) { // \p{L} para qualquer letra, incluindo acentuadas
        JOptionPane.showMessageDialog(this, "Nome completo inválido. Use apenas letras, espaços, pontos, hífens e apóstrofos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        txtNomeCompletoFunc.requestFocus();
        return false;
    }
    // Opcional: Limitar tamanho máximo no DocumentFilter, como mostrado acima.

    // --- 4. Validação de Número de Bilhete (formato angolano ex: 000000000LA000) ---
    // Exemplo: 9 dígitos, 2 letras, 3 dígitos. Ajuste conforme o padrão exato.
    Pattern bilhetePattern = Pattern.compile("^\\d{9}[A-Z]{2}\\d{3}$");
    Matcher bilheteMatcher = bilhetePattern.matcher(numeroBilhete);
    if (!bilheteMatcher.matches()) {
        JOptionPane.showMessageDialog(this, "Número de Bilhete inválido. Formato esperado: 9 dígitos, 2 letras, 3 dígitos (ex: 012345678AZ123).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        txtNumeroBilheteFunc.requestFocus();
        return false;
    }

    // --- 5. Validação de Data de Nascimento (formato dd/MM/yyyy) ---
    if (!dataNascimentoStr.isEmpty()) { // Data de nascimento pode não ser obrigatória, ajuste se for.
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.setLenient(false); // Importante para não permitir datas inválidas como 31/02/2023
        try {
            Date dataNasc = dateFormat.parse(dataNascimentoStr);
            // Opcional: Verificar se a data não é futura e se a pessoa tem uma idade razoável.
            // long diff = new Date().getTime() - dataNasc.getTime();
            // long anos = diff / (1000L * 60 * 60 * 24 * 365);
            // if (anos < 18) {
            //     JOptionPane.showMessageDialog(this, "Funcionário deve ter pelo menos 18 anos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            //     txtDataNascimentoFunc.requestFocus();
            //     return false;
            // }
        } catch (ParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use dd/MM/yyyy.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtDataNascimentoFunc.requestFocus();
            return false;
        }
    } else {
        JOptionPane.showMessageDialog(this, "Data de Nascimento é obrigatória.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        txtDataNascimentoFunc.requestFocus();
        return false;
    }


    // --- 6. Validação de Telefone (apenas números, com ou sem + e espaço inicial) ---
    // Exemplo para Angola: Inicia com 9, 9 dígitos (ex: 9x xxxx xxx)
    // Ajuste a regex conforme o formato de telefone angolano ou internacional que você aceita.
    Pattern telefonePattern = Pattern.compile("^(?:\\+244|0)?9[1-6]\\d{7}$"); // Exemplo para números de Angola: +2449xxxxxxxx ou 09xxxxxxxx ou 9xxxxxxxx
    Matcher telefoneMatcher = telefonePattern.matcher(telefoneStr);
    if (!telefoneMatcher.matches()) {
        JOptionPane.showMessageDialog(this, "Telefone inválido. Formato esperado: 9xxxxxxxxx (Angola).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        txtTelefoneFunc.requestFocus();
        return false;
    }

    // --- 7. Validação de Email ---
    Pattern emailPattern = Pattern.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$");
    Matcher emailMatcher = emailPattern.matcher(email);
    if (!emailMatcher.matches()) {
        JOptionPane.showMessageDialog(this, "Formato de E-mail inválido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        txtEmailFunc.requestFocus();
        return false;
    }

    // --- 8. Validação de Salário (apenas números, pode ser double/decimal) ---
    try {
        Double.parseDouble(salarioStr);
        if (Double.parseDouble(salarioStr) < 0) { // Salário não pode ser negativo
            JOptionPane.showMessageDialog(this, "Salário não pode ser negativo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtSalarioFunc.requestFocus();
            return false;
        }
    } catch (NumberFormatException e) {
        JOptionPane.showMessageDialog(this, "Salário deve ser um número válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        txtSalarioFunc.requestFocus();
        return false;
    }

    // --- 9. Validação de Data de Contratação (formato dd/MM/yyyy) ---
    if (!dataContratacaoStr.isEmpty()) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.setLenient(false);
        try {
            Date dataContratacao = dateFormat.parse(dataContratacaoStr);
            // Opcional: Verificar se a data não é futura
            if (dataContratacao.after(new Date())) {
                JOptionPane.showMessageDialog(this, "Data de Contratação não pode ser no futuro.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtDataContratacaoFunc.requestFocus();
                return false;
            }
        } catch (ParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Contratação inválido. Use dd/MM/yyyy.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtDataContratacaoFunc.requestFocus();
            return false;
        }
    } else {
         JOptionPane.showMessageDialog(this, "Data de Contratação é obrigatória.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
         txtDataContratacaoFunc.requestFocus();
         return false;
    }


    // --- 10. Validação de Sexo (garantir que um radio button está selecionado) ---
    if (!rbFeminino.isSelected() && !rbMasculino.isSelected() && !jRadioButton3.isSelected()) {
        JOptionPane.showMessageDialog(this, "Por favor, selecione o sexo do funcionário.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        return false;
    }

    // --- 11. Validação do campo de Observações (apenas se houver regras específicas além do limite de caracteres) ---
    // Como você disse que não terá validações complexas, o limite de caracteres via DocumentFilter já seria suficiente.
    // Se, por exemplo, não pudesse ter números:
    // if (observacoes.matches(".*\\d.*")) {
    //     JOptionPane.showMessageDialog(this, "Observações não podem conter números.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
    //     txtObservacoes.requestFocus();
    //     return false;
    // }

    return true; // Todos os campos passaram na validação
}

private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
    if (!validarCampos()) {
        return; // Sai do método se a validação falhar
    }

    // Se chegou aqui, os campos estão validados e você pode prosseguir com a lógica de adição:
    DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
    Object[] row = new Object[8]; // Supondo 8 colunas na sua tabela
    row[0] = txtIDFunc.getText();
    row[1] = txtNomeCompletoFunc.getText();
    row[2] = txtNumeroBilheteFunc.getText();
    row[3] = txtCargoFuncaoFunc.getText();
    row[4] = txtTelefoneFunc.getText();
    row[5] = txtEmailFunc.getText();
    row[6] = txtSalarioFunc.getText();
    row[7] = txtDataContratacaoFunc.getText();
    // Você não está adicionando Sexo e Observações na tabela do seu código atual,
    // mas pode adicioná-los se as colunas existirem ou armazená-los em outro lugar.

    model.addRow(row);
    JOptionPane.showMessageDialog(this, "Funcionário adicionado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);

    // Opcional: Limpar campos após adicionar
    limparTodosCampos();
}

// Método auxiliar para limpar todos os campos
private void limparTodosCampos() {
    txtIDFunc.setText("");
    txtNomeCompletoFunc.setText("");
    txtNumeroBilheteFunc.setText("");
    txtDataNascimentoFunc.setText("");
    txtTelefoneFunc.setText("");
    txtEmailFunc.setText("");
    txtCargoFuncaoFunc.setText("");
    txtDataContratacaoFunc.setText("");
    txtSalarioFunc.setText("");
    txtEnderecoFunc.setText("");
    txtObservacoes.setText("");
    buttonGroupSexo.clearSelection(); // Limpa a seleção dos radio buttons de sexo
    txtIDFunc.requestFocus(); // Coloca o foco no primeiro campo
}


// Seus métodos bnLimpar... já fazem isso, mas um método centralizado é útil após a adição.
// E o bnVoltarActionPerformed(java.awt.event.ActionEvent evt) já está mapeado.
private void bnVoltarActionPerformed(java.awt.event.ActionEvent evt) {
    // Lógica para voltar, por exemplo, para a tela de login
    this.dispose(); // Fecha a tela atual
    TelaPrincipal telaPrincipal = new TelaPrincipal(); // Supondo que exista uma TelaPrincipal
    telaPrincipal.setVisible(true);
}

// Seus outros métodos actionListener (txtIDFuncActionPerformed, etc.) podem ser deixados vazios
// a menos que você precise de uma lógica específica quando o usuário pressionar Enter nesses campos.
// Por padrão, eles não precisam de implementação complexa para validação.

private void rbFemininoActionPerformed(java.awt.event.ActionEvent evt) {
    // Não precisa de lógica complexa aqui, o ButtonGroup já cuida da seleção única.
}

private void bnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {
    // Implementar lógica de atualização (primeiro validar, depois obter linha selecionada, etc.)
    JOptionPane.showMessageDialog(this, "Funcionalidade de Atualizar ainda não implementada completamente.", "Informação", JOptionPane.INFORMATION_MESSAGE);
    // Exemplo básico:
    int selectedRow = jTableFuncionarios.getSelectedRow();
    if (selectedRow >= 0) {
        if (validarCampos()) { // Reutiliza a validação
            DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
            model.setValueAt(txtIDFunc.getText(), selectedRow, 0);
            model.setValueAt(txtNomeCompletoFunc.getText(), selectedRow, 1);
            model.setValueAt(txtNumeroBilheteFunc.getText(), selectedRow, 2);
            model.setValueAt(txtCargoFuncaoFunc.getText(), selectedRow, 3);
            model.setValueAt(txtTelefoneFunc.getText(), selectedRow, 4);
            model.setValueAt(txtEmailFunc.getText(), selectedRow, 5);
            model.setValueAt(txtSalarioFunc.getText(), selectedRow, 6);
            model.setValueAt(txtDataContratacaoFunc.getText(), selectedRow, 7);
            JOptionPane.showMessageDialog(this, "Funcionário atualizado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
            limparTodosCampos();
        }
    } else {
        JOptionPane.showMessageDialog(this, "Selecione uma linha na tabela para atualizar.", "Aviso", JOptionPane.WARNING_MESSAGE);
    }
}

private void bnExcluirActionPerformed(java.awt.event.ActionEvent evt) {
    // Implementar lógica de exclusão
    JOptionPane.showMessageDialog(this, "Funcionalidade de Excluir ainda não implementada completamente.", "Informação", JOptionPane.INFORMATION_MESSAGE);
    int selectedRow = jTableFuncionarios.getSelectedRow();
    if (selectedRow >= 0) {
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        int confirm = JOptionPane.showConfirmDialog(this, "Tem certeza que deseja excluir o funcionário selecionado?", "Confirmação de Exclusão", JOptionPane.YES_NO_OPTION);
        if (confirm == JOptionPane.YES_OPTION) {
            model.removeRow(selectedRow);
            JOptionPane.showMessageDialog(this, "Funcionário excluído com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
            limparTodosCampos();
        }
    } else {
        JOptionPane.showMessageDialog(this, "Selecione uma linha na tabela para excluir.", "Aviso", JOptionPane.WARNING_MESSAGE);
    }
}

// ... e todos os seus métodos btnLimpar...
private void btnLimparIDActionPerformed(java.awt.event.ActionEvent evt) { txtIDFunc.setText(""); }
private void btnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) { txtNomeCompletoFunc.setText(""); }
private void btnLimparBilheteActionPerformed(java.awt.event.ActionEvent evt) { txtNumeroBilheteFunc.setText(""); }
private void btnLimparNascimentoActionPerformed(java.awt.event.ActionEvent evt) { txtDataNascimentoFunc.setText(""); }
private void btnLimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) { txtTelefoneFunc.setText(""); }
private void btnLimparEmailActionPerformed(java.awt.event.ActionEvent evt) { txtEmailFunc.setText(""); }
private void btnLimparCargoFuncaoActionPerformed(java.awt.event.ActionEvent evt) { txtCargoFuncaoFunc.setText(""); }
private void btnLimparDataContracaoActionPerformed(java.awt.event.ActionEvent evt) { txtDataContratacaoFunc.setText(""); }
private void btnLimparSalarioActionPerformed(java.awt.event.ActionEvent evt) { txtSalarioFunc.setText(""); }
private void btnLimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) { txtEnderecoFunc.setText(""); }

// Métodos de ActionListener para JTextFields que você pode remover se não precisar de lógica específica neles
private void txtIDFuncActionPerformed(java.awt.event.ActionEvent evt) {}
private void txtNomeCompletoFuncActionPerformed(java.awt.event.ActionEvent evt) {}
private void txtDataNascimentoFuncActionPerformed(java.awt.event.ActionEvent evt) {}
private void txtTelefoneFuncActionPerformed(java.awt.event.ActionEvent evt) {}
private void txtEmailFuncActionPerformed(java.awt.event.ActionEvent evt) {}
private void txtCargoFuncaoFuncActionPerformed(java.awt.event.ActionEvent evt) {}
private void txtDataContratacaoFuncActionPerformed(java.awt.event.ActionEvent evt) {}
private void txtSalarioFuncActionPerformed(java.awt.event.ActionEvent evt) {}
private void txtEnderecoFuncActionPerformed(java.awt.event.ActionEvent evt) {}

Pontos importantes:

  • trim(): Sempre use trim() ao pegar o texto de um campo (getText().trim()) para remover espaços em branco no início e no final, evitando que campos com apenas espaços sejam considerados preenchidos.
  • requestFocus(): Chamar requestFocus() no campo problemático é uma boa prática para guiar o usuário.
  • Mensagens de erro: Use JOptionPane.showMessageDialog com mensagens claras e o tipo de mensagem (JOptionPane.WARNING_MESSAGE, JOptionPane.ERROR_MESSAGE) apropriado.
  • setLenient(false) para SimpleDateFormat: Isso é CRÍTICO para validação de datas. Se estiver como true (padrão), 31/02/2023 seria interpretado como 02/03/2023, o que é um erro. Com false, ele lança ParseException para datas inválidas.
  • Regex: As expressões regulares (Pattern e Matcher) são a ferramenta principal para validar formatos de texto como e-mails, números de telefone, números de bilhete, etc. Ajuste as regex para os padrões exatos que você precisa.
  • Reutilização: O método validarCampos() pode ser chamado tanto no botão "Adicionar" quanto no "Atualizar", garantindo a consistência.

Com essas implementações, você terá validações robustas e amigáveis para o usuário em sua aplicação Java Swing!

TIPO MANDAR UM IF MAS DENTRO DA TELACADAROFUNCIONARIO

Você quer colocar a lógica de validação if diretamente dentro do método bnAdicionarActionPerformed ou bnAtualizarActionPerformed, em vez de ter um método validarCampos() separado. É uma abordagem válida, especialmente para formulários mais simples, mas pode tornar o código mais longo e menos legível se houver muitas validações.

Vamos fazer isso, colocando os ifs de validação diretamente dentro do bnAdicionarActionPerformed:

Java
package telas;

import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.UIManager;
import javax.swing.text.AbstractDocument;
import javax.swing.text.DocumentFilter;
import javax.swing.text.BadLocationException;
import javax.swing.text.AttributeSet;


public class TelaCadatroFuncionario extends javax.swing.JFrame
{

    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName());

    // Classe interna para o DocumentFilter (melhor definida aqui ou em um arquivo separado)
    // Se for usar em vários lugares, uma classe separada é melhor.
    // Para este caso, podemos deixá-la aqui para simplificar.
    private class LengthRestrictedDocumentFilter extends DocumentFilter {
        private int maxLength;

        public LengthRestrictedDocumentFilter(int maxLength) {
            this.maxLength = maxLength;
        }

        @Override
        public void insertString(FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException {
            if ((fb.getDocument().getLength() + str.length()) <= maxLength) {
                super.insertString(fb, offset, str, attr);
            }
        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attrs) throws BadLocationException {
            if ((fb.getDocument().getLength() - length + str.length()) <= maxLength) {
                super.replace(fb, offset, length, str, attrs);
            }
        }
    }

    public TelaCadatroFuncionario()
    {
        initComponents();
        setLocationRelativeTo(null);
        bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]
        {
           "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });

        // APLICANDO O LIMITE DE CARACTERES COM DocumentFilter no construtor
        ((AbstractDocument) txtIDFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10)); // Ex: ID até 10 dígitos
        ((AbstractDocument) txtNomeCompletoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100)); // Nome até 100 caracteres
        ((AbstractDocument) txtNumeroBilheteFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(14)); // Bilhete até 14 caracteres (ex: 000000000LA000)
        ((AbstractDocument) txtDataNascimentoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10)); // Data dd/MM/yyyy
        ((AbstractDocument) txtTelefoneFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(15)); // Telefone
        ((AbstractDocument) txtEmailFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100)); // Email até 100 caracteres
        ((AbstractDocument) txtCargoFuncaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(50)); // Cargo até 50 caracteres
        ((AbstractDocument) txtDataContratacaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10)); // Data Contratação dd/MM/yyyy
        ((AbstractDocument) txtSalarioFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(15)); // Salário (números + ponto/vírgula)
        ((AbstractDocument) txtEnderecoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(200)); // Endereço até 200 caracteres
        ((AbstractDocument) txtObservacoes.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(500)); // Observações até 500 caracteres
    }


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        buttonGroupSexo = new javax.swing.ButtonGroup();
        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalFuncionarios = new javax.swing.JPanel();
        jScrollPaneTabelaFuncionarios = new javax.swing.JScrollPane();
        jTableFuncionarios = new javax.swing.JTable();
        LOGO = new javax.swing.JLabel();
        tITULO = new javax.swing.JLabel();
        lblNomeCompleto = new javax.swing.JLabel();
        lblID = new javax.swing.JLabel();
        lblNumeroBilhete = new javax.swing.JLabel();
        lblDataNascimento = new javax.swing.JLabel();
        lblTelefone = new javax.swing.JLabel();
        lblEmail = new javax.swing.JLabel();
        lblCargoFuncao = new javax.swing.JLabel();
        lblDataContratacao = new javax.swing.JLabel();
        lblSalario = new javax.swing.JLabel();
        lblEndereco = new javax.swing.JLabel();
        lblSexo = new javax.swing.JLabel();
        bnAdicionar = new javax.swing.JButton();
        bnAtualizar = new javax.swing.JButton();
        bnExcluir = new javax.swing.JButton();
        txtIDFunc = new javax.swing.JTextField();
        txtNomeCompletoFunc = new javax.swing.JTextField();
        txtNumeroBilheteFunc = new javax.swing.JTextField();
        txtDataNascimentoFunc = new javax.swing.JTextField();
        txtTelefoneFunc = new javax.swing.JTextField();
        txtEmailFunc = new javax.swing.JTextField();
        txtCargoFuncaoFunc = new javax.swing.JTextField();
        txtDataContratacaoFunc = new javax.swing.JTextField();
        txtSalarioFunc = new javax.swing.JTextField();
        txtEnderecoFunc = new javax.swing.JTextField();
        jScrollPaneObservacoesFunc = new javax.swing.JPanel();
        painelObservacoesFunc = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnLimparID = new javax.swing.JButton();
        btnLimparNome = new javax.swing.JButton();
        btnLimparBilhete = new javax.swing.JButton();
        btnLimparNascimento = new javax.swing.JButton();
        btnLimparTelefone = new javax.swing.JButton();
        btnLimparEmail = new javax.swing.JButton();
        btnLimparCargoFuncao = new javax.swing.JButton();
        btnLimparDataContracao = new javax.swing.JButton();
        btnLimparSalario = new javax.swing.JButton();
        btnLimparEndereco = new javax.swing.JButton();
        bnVoltar = new javax.swing.JButton();
        lblObservacoes = new javax.swing.JLabel();
        rbMasculino = new javax.swing.JRadioButton();
        rbFeminino = new javax.swing.JRadioButton();
        jRadioButton3 = new javax.swing.JRadioButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jScrollPaneTabelaFuncionarios.setPreferredSize(new java.awt.Dimension(850, 250));

        jTableFuncionarios.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null}
            },
            new String [] {
                "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Object.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        jScrollPaneTabelaFuncionarios.setViewportView(jTableFuncionarios);

        LOGO.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        tITULO.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        tITULO.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        tITULO.setText("Gestão de Funcionários");

        lblNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNomeCompleto.setText("Nome Completo");

        lblID.setFont(new java.awt.Font("Liberation Sans", 0, 18)); // NOI18N
        lblID.setText("Id");

        lblNumeroBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNumeroBilhete.setText("Nº de Bilhete");

        lblDataNascimento.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataNascimento.setText("Data Nasc.:");

        lblTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblTelefone.setText("Telefone");

        lblEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEmail.setText("Email");

        lblCargoFuncao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblCargoFuncao.setText("Cargo/Função");

        lblDataContratacao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataContratacao.setText("Data Contratação");

        lblSalario.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSalario.setText("Salário");

        lblEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEndereco.setText("Endereço");

        lblSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSexo.setText("Sexo");

        bnAdicionar.setText("Adicionar");
        bnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAdicionarActionPerformed(evt);
            }
        });

        bnAtualizar.setText("Atualizar");
        bnAtualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAtualizarActionPerformed(evt);
            }
        });

        bnExcluir.setText("Excluir");
        bnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnExcluirActionPerformed(evt);
            }
        });

        txtIDFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtIDFuncActionPerformed(evt);
            }
        });

        txtNomeCompletoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNomeCompletoFuncActionPerformed(evt);
            }
        });

        txtDataNascimentoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataNascimentoFuncActionPerformed(evt);
            }
        });

        txtTelefoneFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtTelefoneFuncActionPerformed(evt);
            }
        });

        txtEmailFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtEmailFuncActionPerformed(evt);
            }
        });

        txtCargoFuncaoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtCargoFuncaoFuncActionPerformed(evt);
            }
        });

        txtDataContratacaoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataContratacaoFuncActionPerformed(evt);
            }
        });

        txtSalarioFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtSalarioFuncActionPerformed(evt);
            }
        });

        txtEnderecoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtEnderecoFuncActionPerformed(evt);
            }
        });

        txtObservacoes.setColumns(20);
        txtObservacoes.setRows(5);
        painelObservacoesFunc.setViewportView(txtObservacoes);

        javax.swing.GroupLayout jScrollPaneObservacoesFuncLayout = new javax.swing.GroupLayout(jScrollPaneObservacoesFunc);
        jScrollPaneObservacoesFunc.setLayout(jScrollPaneObservacoesFuncLayout);
        jScrollPaneObservacoesFuncLayout.setHorizontalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jScrollPaneObservacoesFuncLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(17, 17, 17))
        );
        jScrollPaneObservacoesFuncLayout.setVerticalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.Alignment.TRAILING)
        );

        btnLimparID.setText("Limpar");
        btnLimparID.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparIDActionPerformed(evt);
            }
        });

        btnLimparNome.setText("Limpar");
        btnLimparNome.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNomeActionPerformed(evt);
            }
        });

        btnLimparBilhete.setText("Limpar");
        btnLimparBilhete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparBilheteActionPerformed(evt);
            }
        });

        btnLimparNascimento.setText("Limpar");
        btnLimparNascimento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNascimentoActionPerformed(evt);
            }
        });

        btnLimparTelefone.setText("Limpar");
        btnLimparTelefone.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparTelefoneActionPerformed(evt);
            }
        });

        btnLimparEmail.setText("Limpar");
        btnLimparEmail.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEmailActionPerformed(evt);
            }
        });

        btnLimparCargoFuncao.setText("Limpar");
        btnLimparCargoFuncao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparCargoFuncaoActionPerformed(evt);
            }
        });

        btnLimparDataContracao.setText("Limpar");
        btnLimparDataContracao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparDataContracaoActionPerformed(evt);
            }
        });

        btnLimparSalario.setText("Limpar");
        btnLimparSalario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparSalarioActionPerformed(evt);
            }
        });

        btnLimparEndereco.setText("Limpar");
        btnLimparEndereco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEnderecoActionPerformed(evt);
            }
        });

        bnVoltar.setText("Voltar");
        bnVoltar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnVoltarActionPerformed(evt);
            }
        });

        lblObservacoes.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblObservacoes.setText("Observações");

        rbMasculino.setBackground(new java.awt.Color(153, 153, 153));
        buttonGroupSexo.add(rbMasculino);
        rbMasculino.setText("Masculino");

        rbFeminino.setBackground(new java.awt.Color(153, 153, 153));
        buttonGroupSexo.add(rbFeminino);
        rbFeminino.setText("Feminino");
        rbFeminino.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbFemininoActionPerformed(evt);
            }
        });

        jRadioButton3.setBackground(new java.awt.Color(153, 153, 153));
        buttonGroupSexo.add(jRadioButton3);
        jRadioButton3.setText("outros");

        javax.swing.GroupLayout painelPrincipalFuncionariosLayout = new javax.swing.GroupLayout(painelPrincipalFuncionarios);
        painelPrincipalFuncionarios.setLayout(painelPrincipalFuncionariosLayout);
        painelPrincipalFuncionariosLayout.setHorizontalGroup(
            painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGap(356, 356, 356)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblDataContratacao)
                    .addComponent(lblSalario)
                    .addComponent(lblCargoFuncao)
                    .addComponent(lblEmail)
                    .addComponent(lblTelefone)
                    .addComponent(lblDataNascimento)
                    .addComponent(lblNumeroBilhete)
                    .addComponent(lblNomeCompleto)
                    .addComponent(lblID, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblEndereco)
                    .addComponent(lblSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(34, 34, 34)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(58, 58, 58)
                        .addComponent(lblObservacoes)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 47, Short.MAX_VALUE)
                                .addComponent(btnLimparCargoFuncao))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparEmail))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparTelefone))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparNascimento))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparBilhete))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparNome))
                            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(btnLimparID))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                        .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
                                        .addComponent(txtSalarioFunc)
                                        .addComponent(txtDataContratacaoFunc))
                                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                                        .addComponent(rbFeminino)
                                        .addGap(46, 46, 46)
                                        .addComponent(rbMasculino)))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(jRadioButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(btnLimparDataContracao, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(btnLimparSalario, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(btnLimparEndereco, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                        .addGap(0, 0, Short.MAX_VALUE))))
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(373, 373, 373)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 353, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(tITULO, javax.swing.GroupLayout.PREFERRED_SIZE, 460, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(876, 876, 876)
                        .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(227, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(bnAtualizar)
                        .addGap(137, 137, 137)
                        .addComponent(bnAdicionar)
                        .addGap(323, 323, 323))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(jScrollPaneTabelaFuncionarios, javax.swing.GroupLayout.PREFERRED_SIZE, 1123, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(16, 16, 16))))
        );
        painelPrincipalFuncionariosLayout.setVerticalGroup(
            painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(47, 47, 47)
                        .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(83, 83, 83)
                        .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tITULO)
                .addGap(32, 32, 32)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnLimparID)
                            .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblID))
                        .addGap(37, 37, 37)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblNomeCompleto)))
                    .addComponent(btnLimparNome, javax.swing.GroupLayout.Alignment.TRAILING))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblNumeroBilhete)
                    .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparBilhete))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblDataNascimento)
                    .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparNascimento))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblTelefone)
                    .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparTelefone))
                .addGap(26, 26, 26)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblEmail)
                    .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparEmail))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblCargoFuncao)
                    .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparCargoFuncao))
                .addGap(30, 30, 30)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtDataContratacaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparDataContracao)
                    .addComponent(lblDataContratacao))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnLimparSalario)
                    .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtSalarioFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblSalario)))
                .addGap(25, 25, 25)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparEndereco)
                    .addComponent(lblEndereco))
                .addGap(40, 40, 40)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblSexo)
                    .addComponent(rbFeminino)
                    .addComponent(rbMasculino)
                    .addComponent(jRadioButton3))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 56, Short.MAX_VALUE)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(lblObservacoes)
                        .addGap(69, 69, 69))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(30, 30, 30)))
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bnExcluir))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(painelPrincipalFuncionarios, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(painelPrincipalFuncionarios, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        String idStr = txtIDFunc.getText().trim();
        String nomeCompleto = txtNomeCompletoFunc.getText().trim();
        String numeroBilhete = txtNumeroBilheteFunc.getText().trim();
        String dataNascimentoStr = txtDataNascimentoFunc.getText().trim();
        String telefoneStr = txtTelefoneFunc.getText().trim();
        String email = txtEmailFunc.getText().trim();
        String cargoFuncao = txtCargoFuncaoFunc.getText().trim();
        String dataContratacaoStr = txtDataContratacaoFunc.getText().trim();
        String salarioStr = txtSalarioFunc.getText().trim();
        String endereco = txtEnderecoFunc.getText().trim();
        String observacoes = txtObservacoes.getText().trim(); // Campo de observações

        // --- 1. Validação de campos obrigatórios (exceto Observações, que você disse que não terá validações complexas) ---
        if (idStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'ID' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtIDFunc.requestFocus();
            return;
        }
        if (nomeCompleto.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Nome Completo' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtNomeCompletoFunc.requestFocus();
            return;
        }
        if (numeroBilhete.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Nº de Bilhete' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtNumeroBilheteFunc.requestFocus();
            return;
        }
        if (dataNascimentoStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Data Nasc.' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtDataNascimentoFunc.requestFocus();
            return;
        }
        if (telefoneStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Telefone' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtTelefoneFunc.requestFocus();
            return;
        }
        if (email.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Email' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtEmailFunc.requestFocus();
            return;
        }
        if (cargoFuncao.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Cargo/Função' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtCargoFuncaoFunc.requestFocus();
            return;
        }
        if (dataContratacaoStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Data Contratação' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtDataContratacaoFunc.requestFocus();
            return;
        }
        if (salarioStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Salário' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtSalarioFunc.requestFocus();
            return;
        }
        if (endereco.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Endereço' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtEnderecoFunc.requestFocus();
            return;
        }

        // --- 2. Validação de ID (apenas números) e conversão ---
        try {
            Integer.parseInt(idStr);
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "ID deve conter apenas números inteiros.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtIDFunc.requestFocus();
            return;
        }

        // --- 3. Validação de Nome Completo (apenas letras e espaços, com suporte a acentos) ---
        // A regex \\p{L} cobre qualquer caractere de letra em Unicode.
        if (!nomeCompleto.matches("[\\p{L} .'-]+")) {
            JOptionPane.showMessageDialog(this, "Nome completo inválido. Use apenas letras, espaços, pontos, hífens e apóstrofos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtNomeCompletoFunc.requestFocus();
            return;
        }

        // --- 4. Validação de Número de Bilhete (formato angolano ex: 000000000LA000) ---
        // Ajuste esta regex para o padrão exato do bilhete de identidade angolano.
        // O exemplo abaixo espera 9 dígitos, 2 letras MAIÚSCULAS, 3 dígitos.
        Pattern bilhetePattern = Pattern.compile("^\\d{9}[A-Z]{2}\\d{3}$");
        Matcher bilheteMatcher = bilhetePattern.matcher(numeroBilhete);
        if (!bilheteMatcher.matches()) {
            JOptionPane.showMessageDialog(this, "Número de Bilhete inválido. Formato esperado: 9 dígitos, 2 letras maiúsculas, 3 dígitos (ex: 012345678AZ123).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtNumeroBilheteFunc.requestFocus();
            return;
        }

        // --- 5. Validação de Data de Nascimento (formato dd/MM/yyyy) ---
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.setLenient(false); // Não permite datas inválidas como 31/02
        try {
            Date dataNasc = dateFormat.parse(dataNascimentoStr);
            // Opcional: Verificar se a data não é futura ou se a pessoa tem pelo menos X anos
            Date hoje = new Date();
            if (dataNasc.after(hoje)) {
                JOptionPane.showMessageDialog(this, "Data de Nascimento não pode ser no futuro.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtDataNascimentoFunc.requestFocus();
                return;
            }
            // Exemplo para verificar idade mínima (e.g., 18 anos)
            // Calendar calNasc = Calendar.getInstance();
            // calNasc.setTime(dataNasc);
            // Calendar calHoje = Calendar.getInstance();
            // calHoje.setTime(hoje);
            // int idade = calHoje.get(Calendar.YEAR) - calNasc.get(Calendar.YEAR);
            // if (calNasc.get(Calendar.DAY_OF_YEAR) > calHoje.get(Calendar.DAY_OF_YEAR)) {
            //     idade--;
            // }
            // if (idade < 18) {
            //     JOptionPane.showMessageDialog(this, "Funcionário deve ter no mínimo 18 anos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            //     txtDataNascimentoFunc.requestFocus();
            //     return;
            // }

        } catch (ParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use dd/MM/yyyy.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtDataNascimentoFunc.requestFocus();
            return;
        }

        // --- 6. Validação de Telefone (formato angolano, ex: 9xxxxxxxxx ou 2xx-xxxxxx) ---
        // Adapte esta regex para os padrões de telefone de Angola (fixo e móvel)
        // Exemplo comum para móveis angolanos (91 a 96):
        Pattern telefonePattern = Pattern.compile("^(?:\\+244|0)?9[1-6]\\d{7}$");
        Matcher telefoneMatcher = telefonePattern.matcher(telefoneStr);
        if (!telefoneMatcher.matches()) {
            JOptionPane.showMessageDialog(this, "Telefone inválido. Formato esperado: 9xxxxxxxxx (ex: 923123456) ou +2449xxxxxxxxx.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtTelefoneFunc.requestFocus();
            return;
        }

        // --- 7. Validação de Email ---
        Pattern emailPattern = Pattern.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$");
        Matcher emailMatcher = emailPattern.matcher(email);
        if (!emailMatcher.matches()) {
            JOptionPane.showMessageDialog(this, "Formato de E-mail inválido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtEmailFunc.requestFocus();
            return;
        }

        // --- 8. Validação de Salário (apenas números, pode ser decimal) ---
        try {
            double salario = Double.parseDouble(salarioStr);
            if (salario < 0) {
                JOptionPane.showMessageDialog(this, "Salário não pode ser negativo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtSalarioFunc.requestFocus();
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Salário deve ser um número válido (ex: 150000.00).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtSalarioFunc.requestFocus();
            return;
        }

        // --- 9. Validação de Data de Contratação (formato dd/MM/yyyy) ---
        SimpleDateFormat dateFormatContratacao = new SimpleDateFormat("dd/MM/yyyy");
        dateFormatContratacao.setLenient(false);
        try {
            Date dataContratacao = dateFormatContratacao.parse(dataContratacaoStr);
            Date hoje = new Date();
            if (dataContratacao.after(hoje)) {
                JOptionPane.showMessageDialog(this, "Data de Contratação não pode ser no futuro.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtDataContratacaoFunc.requestFocus();
                return;
            }
        } catch (ParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Contratação inválido. Use dd/MM/yyyy.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtDataContratacaoFunc.requestFocus();
            return;
        }

        // --- 10. Validação de Sexo (garantir que um radio button está selecionado) ---
        if (!rbFeminino.isSelected() && !rbMasculino.isSelected() && !jRadioButton3.isSelected()) {
            JOptionPane.showMessageDialog(this, "Por favor, selecione o sexo do funcionário.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            rbMasculino.requestFocus(); // Ou qualquer um dos botões
            return;
        }

        // --- 11. Validação do campo de Observações (apenas o limite de caracteres via DocumentFilter) ---
        // Conforme sua solicitação, não há validações de conteúdo específicas para Observações,
        // apenas o limite de caracteres já aplicado no construtor com o DocumentFilter.
        // Se houver alguma regra futura (ex: não permitir caracteres especiais), adicione aqui.


        // Se todas as validações passaram, adiciona à tabela
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        Object[] row = new Object[8]; // Certifique-se que o número de colunas corresponde
        row[0] = idStr;
        row[1] = nomeCompleto;
        row[2] = numeroBilhete;
        row[3] = cargoFuncao;
        row[4] = telefoneStr;
        row[5] = email;
        row[6] = salarioStr;
        row[7] = dataContratacaoStr;

        model.addRow(row);
        JOptionPane.showMessageDialog(this, "Funcionário adicionado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);

        limparTodosCampos(); // Chama o método para limpar os campos
    }

    private void txtIDFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // Nada a fazer aqui se não houver lógica específica ao pressionar Enter
    }

    private void txtNomeCompletoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // Nada a fazer aqui
    }

    private void txtDataNascimentoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // Nada a fazer aqui
    }

    private void txtTelefoneFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // Nada a fazer aqui
    }

    private void txtEmailFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // Nada a fazer aqui
    }

    private void txtCargoFuncaoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // Nada a fazer aqui
    }

    private void txtDataContratacaoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // Nada a fazer aqui
    }

    private void txtSalarioFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // Nada a fazer aqui
    }

    private void txtEnderecoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // Nada a fazer aqui
    }

    private void btnLimparIDActionPerformed(java.awt.event.ActionEvent evt) {
        txtIDFunc.setText("");
    }

    private void btnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        txtNomeCompletoFunc.setText("");
    }

    private void btnLimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        txtNumeroBilheteFunc.setText("");
    }

    private void btnLimparNascimentoActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataNascimentoFunc.setText("");
    }

    private void btnLimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) {
        txtTelefoneFunc.setText("");
    }

    private void btnLimparEmailActionPerformed(java.awt.event.ActionEvent evt) {
        txtEmailFunc.setText("");
    }

    private void btnLimparCargoFuncaoActionPerformed(java.awt.event.ActionEvent evt) {
        txtCargoFuncaoFunc.setText("");
    }

    private void btnLimparDataContracaoActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataContratacaoFunc.setText("");
    }

    private void btnLimparSalarioActionPerformed(java.awt.event.ActionEvent evt) {
        txtSalarioFunc.setText("");
    }

    private void btnLimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
        txtEnderecoFunc.setText("");
    }

    private void bnVoltarActionPerformed(java.awt.event.ActionEvent evt) {
        // Lógica para voltar para a TelaPrincipal
        this.dispose(); // Fecha a tela atual
        TelaPrincipal telaPrincipal = new TelaPrincipal(); // Certifique-se que TelaPrincipal existe e está no mesmo pacote ou importada
        telaPrincipal.setVisible(true);
    }

    private void rbFemininoActionPerformed(java.awt.event.ActionEvent evt) {
        // Lógica se algo precisar ser feito quando o radio button feminino for selecionado
    }

    private void bnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {
        // Implementar a lógica de atualização aqui, com as mesmas validações
        int selectedRow = jTableFuncionarios.getSelectedRow();
        if (selectedRow == -1) {
            JOptionPane.showMessageDialog(this, "Selecione uma linha na tabela para atualizar.", "Aviso", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // Repita a lógica de validação aqui ou chame um método auxiliar para evitar duplicação de código.
        // Por exemplo, você pode extrair toda a lógica de validação do bnAdicionarActionPerformed
        // para um novo método `boolean performValidations()` e chamá-lo aqui.
        // Se decidir duplicar, o código seria muito semelhante ao do bnAdicionarActionPerformed.

        // Exemplo (simplificado, mas você deve incluir todas as validações):
        String idStr = txtIDFunc.getText().trim();
        String nomeCompleto = txtNomeCompletoFunc.getText().trim();
        // ... (pegue todos os campos)

        // *** AQUI VOCÊ REPETIRIA TODOS OS BLOCOS `IF` DE VALIDAÇÃO DO `bnAdicionarActionPerformed` ***
        // Para evitar repetição, uma boa prática seria ter um método `validarCampos()`
        // e chamá-lo tanto no adicionar quanto no atualizar.
        // Mas se o objetivo é ter os `if`s aqui, você os colocaria.

        // Apenas como demonstração, validando apenas o ID aqui para não duplicar todo o código
        // mas na prática, VOCÊ DEVE VALIDAR TODOS OS CAMPOS NOVAMENTE.
        if (idStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'ID' é obrigatório para atualização.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtIDFunc.requestFocus();
            return;
        }
        try {
            Integer.parseInt(idStr);
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "ID deve conter apenas números inteiros para atualização.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtIDFunc.requestFocus();
            return;
        }

        // Se todas as validações passarem (VOCÊ DEVE IMPLEMENTÁ-LAS TODAS AQUI)
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setValueAt(idStr, selectedRow, 0);
        model.setValueAt(nomeCompleto, selectedRow, 1);
        model.setValueAt(numeroBilhete, selectedRow, 2);
        model.setValueAt(cargoFuncao, selectedRow, 3);
        model.setValueAt(telefoneStr, selectedRow, 4);
        model.setValueAt(email, selectedRow, 5);
        model.setValueAt(salarioStr, selectedRow, 6);
        model.setValueAt(dataContratacaoStr, selectedRow, 7);
        // Não esqueça de atualizar Sexo e Observações se estiverem na tabela ou modelo de dados.

        JOptionPane.showMessageDialog(this, "Funcionário atualizado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
        limparTodosCampos();
    }

    private void bnExcluirActionPerformed(java.awt.event.ActionEvent evt) {
        int selectedRow = jTableFuncionarios.getSelectedRow();
        if (selectedRow == -1) {
            JOptionPane.showMessageDialog(this, "Selecione uma linha na tabela para excluir.", "Aviso", JOptionPane.WARNING_MESSAGE);
            return;
        }

        int confirm = JOptionPane.showConfirmDialog(this, "Tem certeza que deseja excluir o funcionário selecionado?", "Confirmação de Exclusão", JOptionPane.YES_NO_OPTION);
        if (confirm == JOptionPane.YES_OPTION) {
            DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
            model.removeRow(selectedRow);
            JOptionPane.showMessageDialog(this, "Funcionário excluído com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
            limparTodosCampos(); // Limpa os campos após a exclusão
        }
    }

    // Método auxiliar para limpar todos os campos
    private void limparTodosCampos() {
        txtIDFunc.setText("");
        txtNomeCompletoFunc.setText("");
        txtNumeroBilheteFunc.setText("");
        txtDataNascimentoFunc.setText("");
        txtTelefoneFunc.setText("");
        txtEmailFunc.setText("");
        txtCargoFuncaoFunc.setText("");
        txtDataContratacaoFunc.setText("");
        txtSalarioFunc.setText("");
        txtEnderecoFunc.setText("");
        txtObservacoes.setText("");
        buttonGroupSexo.clearSelection();
        txtIDFunc.requestFocus();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TelaCadatroFuncionario().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel LOGO;
    private javax.swing.JButton bnAdicionar;
    private javax.swing.JButton bnAtualizar;
    private javax.swing.JButton bnExcluir;
    private javax.swing.JButton bnVoltar;
    private javax.swing.JButton btnLimparBilhete;
    private javax.swing.JButton btnLimparCargoFuncao;
    private javax.swing.JButton btnLimparDataContracao;
    private javax.swing.JButton btnLimparEmail;
    private javax.swing.JButton btnLimparEndereco;
    private javax.swing.JButton btnLimparID;
    private javax.swing.JButton btnLimparNascimento;
    private javax.swing.JButton btnLimparNome;
    private javax.swing.JButton btnLimparSalario;
    private javax.swing.JButton btnLimparTelefone;
    private javax.swing.ButtonGroup buttonGroupSexo;
    private javax.swing.JRadioButton jRadioButton3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPanel jScrollPaneObservacoesFunc;
    private javax.swing.JScrollPane jScrollPaneTabelaFuncionarios;
    private javax.swing.JTable jTableFuncionarios;
    private javax.swing.JLabel lblCargoFuncao;
    private javax.swing.JLabel lblDataContratacao;
    private javax.swing.JLabel lblDataNascimento;
    private javax.swing.JLabel lblEmail;
    private javax.swing.JLabel lblEndereco;
    private javax.swing.JLabel lblID;
    private javax.swing.JLabel lblNomeCompleto;
    private javax.swing.JLabel lblNumeroBilhete;
    private javax.swing.JLabel lblObservacoes;
    private javax.swing.JLabel lblSalario;
    private javax.swing.JLabel lblSexo;
    private javax.swing.JLabel lblTelefone;
    private javax.swing.JPanel painelObservacoesFunc;
    private javax.swing.JPanel painelPrincipalFuncionarios;
    private javax.swing.JRadioButton rbFeminino;
    private javax.swing.JRadioButton rbMasculino;
    private javax.swing.JLabel tITULO;
    private javax.swing.JTextField txtCargoFuncaoFunc;
    private javax.swing.JTextField txtDataContratacaoFunc;
    private javax.swing.JTextField txtDataNascimentoFunc;
    private javax.swing.JTextField txtEmailFunc;
    private javax.swing.JTextField txtEnderecoFunc;
    private javax.swing.JTextField txtIDFunc;
    private javax.swing.JTextField txtNomeCompletoFunc;
    private javax.swing.JTextField txtNumeroBilheteFunc;
    private javax.swing.JTextArea txtObservacoes;
    private javax.swing.JTextField txtSalarioFunc;
    private javax.swing.JTextField txtTelefoneFunc;
    // End of variables declaration
}

Principais mudanças e pontos a notar:

  1. Classe LengthRestrictedDocumentFilter: Eu a mantive como uma classe interna private dentro de TelaCadatroFuncionario para que tudo esteja no mesmo arquivo, como você pode preferir. Isso é usado no construtor para limitar o número de caracteres em todos os seus campos.
  2. bnAdicionarActionPerformed:
    • Todas as validações (ifs) foram movidas diretamente para dentro deste método.
    • Para cada if que detecta um erro, um JOptionPane é exibido, o foco é colocado no campo problemático (requestFocus()), e o método return; é usado para parar a execução e não adicionar a linha na tabela.
    • A lógica para adicionar a linha na tabela (model.addRow(row);) só é executada se todos os ifs de validação forem passados sem retornar.
  3. bnAtualizarActionPerformed:
    • Chamei a atenção para o fato de que você precisaria repetir a mesma lógica de validação do bnAdicionarActionPerformed aqui. Isso é o que torna o código mais longo e duplica.
    • Para a demonstração, adicionei apenas as validações de ID nele, mas você precisaria copiar e colar todas as validações dos outros campos se quiser essa abordagem sem um método de validação separado.
  4. limparTodosCampos(): Mantive este método separado para evitar duplicação do código de limpeza, pois ele é útil tanto após adicionar quanto após excluir/atualizar.

Esta estrutura com os ifs aninhados dentro do método de ação é comum para formulários menores ou quando a lógica é simples. Para formulários maiores e mais complexos, o método validarCampos() separado (como na minha resposta anterior) é geralmente preferível para melhor organização e reusabilidade do código.

Com este código, ao clicar em "Adicionar", o sistema verificará cada campo na ordem, e se encontrar algum erro, mostrará a mensagem e parará a operação.

ser que tipo DocumentFilter

No contexto do Java Swing, um DocumentFilter é uma classe abstrata muito útil que permite filtrar e/ou modificar o texto que está prestes a ser inserido, removido ou substituído em um componente de texto (como JTextField, JTextArea, JTextPane, etc.).

Pense nele como uma "barreira" ou "portão" que fica entre o que o usuário digita (ou o que é colado programaticamente) e o Document real (que armazena o texto do componente). Antes que qualquer alteração seja feita no Document, o DocumentFilter tem a chance de interceptar e decidir se a alteração é permitida ou como ela deve ser modificada.

Para que serve?

O DocumentFilter é usado principalmente para implementar validações de entrada e restrições em tempo real nos campos de texto. Alguns exemplos de uso:

  • Limitar o número de caracteres: Como você usou no seu código com LengthRestrictedDocumentFilter, ele impede que o usuário digite mais do que um certo número de caracteres.
  • Permitir apenas números: Pode-se criar um filtro que rejeita qualquer caractere que não seja um dígito.
  • Permitir apenas letras: Rejeita números e caracteres especiais.
  • Formatos específicos: Por exemplo, um campo de telefone que só aceita números e hífens, ou um campo de CPF/NIF que segue um padrão específico.
  • Converter entrada: Transformar automaticamente todo o texto para maiúsculas ou minúsculas.
  • Validação de email em tempo real: Embora a validação completa geralmente ocorra no ActionListener (como você fez), um DocumentFilter pode impedir caracteres inválidos para um email enquanto o usuário digita.

Como funciona?

Um DocumentFilter tem três métodos principais que você pode sobrescrever:

  1. insertString(FilterBypass fb, int offset, String str, AttributeSet attr): Este método é chamado antes que uma nova string seja inserida no documento.
  2. remove(FilterBypass fb, int offset, int length): Chamado antes que uma parte do texto seja removida.
  3. replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs): Chamado antes que uma parte do texto seja substituída por uma nova string.

Dentro desses métodos, você tem acesso ao FilterBypass (fb), que é uma maneira de "contornar" o filtro e aplicar a alteração diretamente ao Document subjacente. Se você não chamar os métodos do FilterBypass (como fb.insertString(), fb.remove(), fb.replace()), a alteração simplesmente não ocorrerá.

No seu LengthRestrictedDocumentFilter que eu incluí, a lógica é:

Java
private class LengthRestrictedDocumentFilter extends DocumentFilter {
    private int maxLength;

    public LengthRestrictedDocumentFilter(int maxLength) {
        this.maxLength = maxLength;
    }

    @Override
    public void insertString(FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException {
        // Verifica se o comprimento total (atual + novo texto) não excede o maxLength
        if ((fb.getDocument().getLength() + str.length()) <= maxLength) {
            super.insertString(fb, offset, str, attr); // Se sim, permite a inserção
        }
        // Se não, não faz nada, impedindo a inserção
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attrs) throws BadLocationException {
        // Verifica se o comprimento total (atual - texto a ser substituído + novo texto) não excede o maxLength
        if ((fb.getDocument().getLength() - length + str.length()) <= maxLength) {
            super.replace(fb, offset, length, str, attrs); // Se sim, permite a substituição
        }
        // Se não, não faz nada
    }
}

E para aplicá-lo a um JTextField (ou JTextArea), você faz:

Java
((AbstractDocument) txtSeuCampo.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));

O DocumentFilter é uma ferramenta poderosa para controlar a entrada do usuário em tempo real, melhorando a experiência do usuário e a robustez da sua aplicação, garantindo que os dados inseridos sigam certas regras antes mesmo de serem submetidos.

si mas para por no pacote telas e vousavlvar com que etsensao

Para colocar a classe DocumentFilter no pacote telas e salvá-la como um arquivo Java, você faria o seguinte:

  1. Crie um novo arquivo Java dentro do seu pacote telas.
  2. Nome do arquivo: O nome do arquivo deve ser o mesmo nome da classe pública. Então, se a classe se chama LengthRestrictedDocumentFilter, o arquivo deve ser LengthRestrictedDocumentFilter.java.
  3. Conteúdo do arquivo: O arquivo deve conter o código da classe, com a declaração de pacote no topo.

Exemplo:

Crie um novo arquivo chamado LengthRestrictedDocumentFilter.java dentro da pasta telas (que estará dentro da pasta src ou src/main/java do seu projeto).

O conteúdo do arquivo LengthRestrictedDocumentFilter.java seria:

Java
package telas; // <<--- Importante: declare o pacote aqui

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

/**
 * Um DocumentFilter que restringe o número máximo de caracteres permitidos
 * em um componente de texto (JTextField, JTextArea, etc.).
 */
public class LengthRestrictedDocumentFilter extends DocumentFilter {
    private int maxLength;

    public LengthRestrictedDocumentFilter(int maxLength) {
        this.maxLength = maxLength;
    }

    @Override
    public void insertString(FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException {
        if ((fb.getDocument().getLength() + str.length()) <= maxLength) {
            super.insertString(fb, offset, str, attr);
        }
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attrs) throws BadLocationException {
        if ((fb.getDocument().getLength() - length + str.length()) <= maxLength) {
            super.replace(fb, offset, length, str, attrs);
        }
    }

    @Override
    public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
        super.remove(fb, offset, length); // Permite a remoção de caracteres normalmente
    }
}

Como usar na TelaCadatroFuncionario (ou em outras telas):

Agora que LengthRestrictedDocumentFilter é uma classe separada no mesmo pacote telas, você pode usá-la diretamente sem precisar declará-la como uma classe interna.

No construtor da sua TelaCadatroFuncionario, você continuará aplicando os filtros da mesma forma:

Java
package telas;

// Adicione este import se ainda não estiver lá, embora se estiver no mesmo pacote, pode não ser estritamente necessário.
import javax.swing.text.AbstractDocument;

public class TelaCadatroFuncionario extends javax.swing.JFrame {

    // ... seu código existente ...

    public TelaCadatroFuncionario() {
        initComponents();
        setLocationRelativeTo(null);
        bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]
        {
           "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });

        // APLICANDO O LIMITE DE CARACTERES com a classe separada
        ((AbstractDocument) txtIDFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));
        ((AbstractDocument) txtNomeCompletoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100));
        ((AbstractDocument) txtNumeroBilheteFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(14));
        ((AbstractDocument) txtDataNascimentoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));
        ((AbstractDocument) txtTelefoneFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(15));
        ((AbstractDocument) txtEmailFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100));
        ((AbstractDocument) txtCargoFuncaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(50));
        ((AbstractDocument) txtDataContratacaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));
        ((AbstractDocument) txtSalarioFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(15));
        ((AbstractDocument) txtEnderecoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(200));
        ((AbstractDocument) txtObservacoes.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(500));
    }

    // ... resto da sua classe TelaCadatroFuncionario ...
}

A vantagem de fazer isso é que a classe LengthRestrictedDocumentFilter se torna reutilizável em outros lugares do seu projeto, se você precisar limitar o comprimento de outros campos de texto em diferentes telas. É uma prática de boa organização de código.

Aparentemente, houve um problema na compilação do seu projeto Java, especificamente no arquivo TelaCadatroFuncionario.java. As mensagens de erro indicam:

  1. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:989: error: class, interface, enum, or record expected

    • Este erro geralmente significa que há um problema de sintaxe na linha 989, onde o compilador esperava que uma nova classe, interface, enum ou record fosse declarada, mas encontrou algo inesperado. Isso pode ser causado por:
      • Chaves desbalanceadas: Um } extra ou faltando em algum lugar, que faz com que o compilador pense que uma declaração de classe terminou prematuramente ou está malformada.
      • Código fora de qualquer classe: Você pode ter algum código Java (como um método ou uma variável) declarado diretamente no arquivo, mas fora de qualquer definição de classe.
      • Erros de digitação ou caracteres estranhos.
  2. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:5: error: unnamed class should not have package declaration

    • Este erro (unnamed class should not have package declaration) é muito específico e sugere que você está usando uma "unnamed class" (também conhecida como "classe anônima" ou "classe de instância única", um recurso do Java 21 preview) com uma declaração de pacote.
    • Contexto Java 21 Preview: As unnamed classes são um recurso de pré-visualização no Java 21, projetadas principalmente para scripts ou programas simples de um único arquivo que não precisam de uma declaração de pacote explícita.
    • Se você não pretende usar "unnamed classes": Este erro provavelmente indica que o NetBeans (ou a ferramenta que você está usando) está compilando seu projeto com o suporte a recursos de pré-visualização do Java 21 ativado, e algo no seu código está sendo interpretado como uma "unnamed class" quando não deveria.

Para resolver esses problemas, siga os passos abaixo:

1. Corrigir o erro da linha 989 (class, interface, enum, or record expected)

A primeira coisa a fazer é inspecionar o arquivo TelaCadatroFuncionario.java na linha 989.

  • Abra o arquivo: Localize e abra o arquivo: /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java.
  • Vá para a linha 989: Verifique o que está nessa linha e nas linhas ao redor.
  • Verifique as chaves {}: O erro mais comum aqui é uma chave de fechamento } extra ou uma chave de abertura { faltando em algum método ou bloco de código. Certifique-se de que cada { tem um } correspondente.
    • Uma maneira fácil de verificar em um IDE como o NetBeans é clicar na chave de abertura de um bloco e ver se a chave de fechamento correspondente é destacada, e vice-versa.
  • Código fora da classe: Verifique se não há nenhum trecho de código solto (como um método completo ou uma variável) que não esteja dentro da definição da classe TelaCadatroFuncionario. Todo o código Java precisa estar dentro de uma classe.

Sugestão: Se você copiou e colou o código da minha última resposta, verifique se não houve nenhum erro na cópia, principalmente se não cortou a última chave } da classe.

2. Corrigir o erro da linha 5 (unnamed class should not have package declaration)

Este erro é mais intrigante porque a TelaCadatroFuncionario deve ter uma declaração de pacote. Ele sugere que o compilador a está tratando como uma "unnamed class", que é um recurso específico do Java 21 preview.

  • Verifique suas configurações de projeto:

    • No NetBeans (assumo que você está usando NetBeans porque o erro é comum em ambientes IDE):
      1. Clique com o botão direito no seu projeto "SistemaGestaoHoteleiro".
      2. Selecione "Properties" (Propriedades).
      3. Vá para a categoria "Source" (Fonte) ou "Build" -> "Compiling" (Compilando).
      4. Procure pela "Source/Binary Format" (Formato de Origem/Binário) ou "Java Platform" (Plataforma Java).
      5. Certifique-se de que você não está usando "Java 21 (Preview)" ou que "Enable preview features" (Habilitar recursos de pré-visualização) não esteja marcado, a menos que você realmente saiba o que está fazendo com os recursos de pré-visualização. Idealmente, defina seu projeto para usar Java 8, 11, 17, ou 21 (não-preview).
    • Verifique se você não está usando por engano o jar de uma versão de SDK antiga com o source do java 21. Se você especificou usar o SDK 52 (Java 21) e está desenvolvendo para ele, precisa ter cuidado com recursos de pré-visualização.
  • Verifique o arquivo TelaCadatroFuncionario.java novamente:

    • A linha 5 deve ser simplesmente: package telas;
    • Não deve haver nada antes ou depois dessa linha que possa confundir o compilador para que ele a interprete como uma classe anônima.
    • Verifique se não há classes internas anônimas com declarações de pacote, o que seria incomum.

Possível cenário para o segundo erro:

É possível que o primeiro erro (chaves desbalanceadas) esteja causando o segundo. Se a estrutura da sua classe TelaCadatroFuncionario estiver quebrada (por exemplo, uma chave de fechamento } extra antes do final da classe), o compilador pode ver o restante do arquivo como código "solto" fora de qualquer classe nomeada, levando-o a tentar interpretá-lo como uma "unnamed class" e então reclamar da declaração de pacote.

Recomendação:

  1. Foque primeiro em resolver o erro da linha 989. Resolvendo-o, o erro da "unnamed class" pode desaparecer automaticamente.
  2. Use o IDE para ajudar: O NetBeans tem ótimas ferramentas para depurar erros de sintaxe, incluindo realce de chaves e indicação de erros em tempo real.

Se você puder colar o código da TelaCadatroFuncionario.java (especialmente a parte final e onde a linha 989 se encontra, e também o cabeçalho do arquivo), posso ajudar a identificar o problema exato.

quero falidar data de nascimento exemplo com 12/07/2002

Certo! Para validar uma data de nascimento no formato dd/MM/yyyy (como 12/07/2002) em Java, e também verificar se a pessoa tem uma idade mínima (por exemplo, 18 anos), você pode usar a classe SimpleDateFormat junto com a classe Calendar para manipulação de datas.

Vou te mostrar como implementar essa validação diretamente no seu método bnAdicionarActionPerformed, onde as outras validações já estão.

Modificações no seu código TelaCadatroFuncionario.java:

A parte relevante é dentro do bnAdicionarActionPerformed, na seção de validação de data de nascimento.

Java
// ... (seu código anterior) ...

    private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        // ... (seus campos de texto sendo pegos) ...
        String dataNascimentoStr = txtDataNascimentoFunc.getText().trim();
        // ... (resto dos seus campos) ...

        // --- 1. Validação de campos obrigatórios (se dataNascimentoStr estiver vazio) ---
        if (dataNascimentoStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Data Nasc.' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtDataNascimentoFunc.requestFocus();
            return;
        }

        // --- 5. Validação de Data de Nascimento (formato dd/MM/yyyy e idade mínima) ---
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.setLenient(false); // Esta linha é CRUCIAL! Impede datas inválidas como 31/02 ou 30/02/2023.

        try {
            Date dataNasc = dateFormat.parse(dataNascimentoStr); // Tenta converter a string para um objeto Date

            // --- Validação 5.1: Data não pode ser no futuro ---
            Date hoje = new Date(); // Data atual
            if (dataNasc.after(hoje)) {
                JOptionPane.showMessageDialog(this, "Data de Nascimento não pode ser uma data futura.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtDataNascimentoFunc.requestFocus();
                return;
            }

            // --- Validação 5.2: Idade Mínima (ex: 18 anos) ---
            // Use Calendar para manipulação de datas e cálculo de idade de forma mais precisa
            java.util.Calendar calNasc = java.util.Calendar.getInstance();
            calNasc.setTime(dataNasc); // Define a data de nascimento no Calendar

            java.util.Calendar calHoje = java.util.Calendar.getInstance();
            calHoje.setTime(hoje); // Define a data de hoje no Calendar

            int idade = calHoje.get(java.util.Calendar.YEAR) - calNasc.get(java.util.Calendar.YEAR);

            // Ajuste a idade se o aniversário ainda não ocorreu este ano
            if (calNasc.get(java.util.Calendar.MONTH) > calHoje.get(java.util.Calendar.MONTH) ||
                (calNasc.get(java.util.Calendar.MONTH) == calHoje.get(java.util.Calendar.MONTH) &&
                 calNasc.get(java.util.Calendar.DAY_OF_MONTH) > calHoje.get(java.util.Calendar.DAY_OF_MONTH))) {
                idade--;
            }

            // Defina a idade mínima desejada
            int idadeMinima = 18; // Por exemplo, funcionário deve ter no mínimo 18 anos

            if (idade < idadeMinima) {
                JOptionPane.showMessageDialog(this, "O funcionário deve ter no mínimo " + idadeMinima + " anos de idade.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtDataNascimentoFunc.requestFocus();
                return;
            }

        } catch (ParseException e) {
            // Se o SimpleDateFormat.parse() lançar ParseException, significa que a string não está no formato dd/MM/yyyy
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use dd/MM/yyyy (ex: 12/07/2002).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtDataNascimentoFunc.requestFocus();
            return;
        }

        // ... (restante das suas validações e código para adicionar à tabela) ...
    }

// ... (resto da sua classe) ...

Explicação dos pontos importantes:

  1. SimpleDateFormat("dd/MM/yyyy"): Define o formato esperado para a data.
  2. dateFormat.setLenient(false): Esta linha é fundamental! Por padrão, SimpleDateFormat é "lenient" (complacente), o que significa que ele tentaria interpretar datas como 31/02/2023 (que é inválida) ajustando-a para 03/03/2023. Ao definir setLenient(false), ele se torna rigoroso e lançará uma ParseException para qualquer data que não seja logicamente válida para o formato e o calendário (ex: dias inválidos para o mês, meses inválidos).
  3. dateFormat.parse(dataNascimentoStr): Tenta converter a string de data fornecida pelo usuário para um objeto java.util.Date. Se a string não corresponder ao formato ou for uma data inválida (por causa do setLenient(false)), ele lançará uma ParseException, que é capturada pelo bloco catch.
  4. dataNasc.after(hoje): Verifica se a data de nascimento informada é posterior à data atual. Se for, significa que a pessoa ainda não nasceu, o que é um erro.
  5. Cálculo da Idade com Calendar:
    • Usamos java.util.Calendar para fazer o cálculo da idade de forma mais precisa, levando em conta o mês e o dia do aniversário, não apenas o ano.
    • Ele subtrai os anos e depois ajusta se o aniversário do ano corrente ainda não ocorreu.
  6. idadeMinima: Você pode definir a idade mínima que o funcionário deve ter.
  7. return;: Se qualquer validação falhar, uma mensagem de erro é exibida, o foco é retornado para o campo txtDataNascimentoFunc, e o método bnAdicionarActionPerformed é encerrado (return;), impedindo que o funcionário seja adicionado.

Com esta implementação, você garante que as datas de nascimento são válidas, não são futuras, e que o funcionário atende a um requisito de idade mínima.

Sim, exatamente! Os campos que são numericamente inteiros ou decimais devem ser validados e convertidos para os seus respectivos tipos numéricos (int, double, etc.) antes de serem utilizados ou armazenados. Se essa conversão falhar (por exemplo, o usuário digitou letras em um campo de ID), você deve exibir uma mensagem de erro.

Vamos revisar os campos que você listou e como eles devem ser tratados, incluindo as validações e as conversões para int ou double:

  1. String id = txtIDFunc.getText().trim();

    • Tipo esperado: int (inteiro)
    • Validação:
      • Não pode ser vazio.
      • Deve conter apenas dígitos.
    • Conversão: int idFunc = Integer.parseInt(id);
    • Tratamento de erro: Usar um bloco try-catch (NumberFormatException) para capturar entradas não numéricas.
  2. String nomeCompleto = txtNomeCompletoFunc.getText().trim();

    • Tipo esperado: String
    • Validação:
      • Não pode ser vazio.
      • Pode-se validar para permitir apenas letras, espaços, apóstrofos, hífens.
  3. String numeroBilhete = txtNumeroBilheteFunc.getText().trim();

    • Tipo esperado: String
    • Validação:
      • Não pode ser vazio.
      • Deve seguir um formato específico (ex: 9 dígitos, 2 letras, 3 dígitos para Angola).
  4. String dataNascimentoStr = txtDataNascimentoFunc.getText().trim();

    • Tipo esperado: String (mas será convertido para java.util.Date para validação e armazenamento, ou mantido como String formatada)
    • Validação:
      • Não pode ser vazio.
      • Deve seguir o formato dd/MM/yyyy.
      • Não pode ser uma data futura.
      • Deve atender a uma idade mínima.
    • Conversão: java.util.Date dataNascimento = dateFormat.parse(dataNascimentoStr); (dentro de um try-catch)
  5. String telefone = txtTelefoneFunc.getText().trim();

    • Tipo esperado: String
    • Validação:
      • Não pode ser vazio.
      • Deve seguir um formato de telefone válido (pode ser uma regex).
  6. String email = txtEmailFunc.getText().trim();

    • Tipo esperado: String
    • Validação:
      • Não pode ser vazio.
      • Deve seguir um formato de email válido (com @ e .).
  7. String cargoFuncao = txtCargoFuncaoFunc.getText().trim();

    • Tipo esperado: String
    • Validação:
      • Não pode ser vazio.
      • (Opcional) Pode-se validar para permitir apenas letras e espaços.
  8. String dataContratacaoStr = txtDataContratacaoFunc.getText().trim();

    • Tipo esperado: String (mas será convertido para java.util.Date para validação e armazenamento, ou mantido como String formatada)
    • Validação:
      • Não pode ser vazio.
      • Deve seguir o formato dd/MM/yyyy.
      • Não pode ser uma data futura.
    • Conversão: java.util.Date dataContratacao = dateFormat.parse(dataContratacaoStr); (dentro de um try-catch)
  9. String salarioStr = txtSalarioFunc.getText().trim();

    • Tipo esperado: double (decimal)
    • Validação:
      • Não pode ser vazio.
      • Deve conter um valor numérico válido (inteiro ou decimal, com ponto ou vírgula dependendo da localidade, mas Java Double.parseDouble prefere ponto).
      • Não pode ser negativo (regra de negócio).
    • Conversão: double salario = Double.parseDouble(salarioStr);
    • Tratamento de erro: Usar um bloco try-catch (NumberFormatException).
  10. String endereco = txtEnderecoFunc.getText().trim();

    • Tipo esperado: String
    • Validação:
      • Não pode ser vazio.
  11. String observacoes = txtObservacoes.getText().trim();

    • Tipo esperado: String
    • Validação: Geralmente não requer validações de conteúdo complexas, apenas o limite de caracteres via DocumentFilter.

Exemplo de implementação com int e double (já incluído nas minhas respostas anteriores, mas reforçando):

Java
// ... dentro do bnAdicionarActionPerformed ...

String idStr = txtIDFunc.getText().trim();
// ... outros campos String ...
String salarioStr = txtSalarioFunc.getText().trim();

// 1. Validação e conversão do ID (int)
int idFunc; // Declare a variável fora do try para que possa ser usada depois
try {
    if (idStr.isEmpty()) {
        JOptionPane.showMessageDialog(this, "O campo 'ID' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
        txtIDFunc.requestFocus();
        return;
    }
    idFunc = Integer.parseInt(idStr); // Tenta converter
    if (idFunc <= 0) { // Exemplo de validação adicional para ID
        JOptionPane.showMessageDialog(this, "ID deve ser um número positivo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        txtIDFunc.requestFocus();
        return;
    }
} catch (NumberFormatException e) {
    JOptionPane.showMessageDialog(this, "ID deve conter apenas números inteiros válidos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
    txtIDFunc.requestFocus();
    return;
}

// 2. Validação e conversão do Salário (double)
double salario; // Declare a variável fora do try
try {
    if (salarioStr.isEmpty()) {
        JOptionPane.showMessageDialog(this, "O campo 'Salário' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
        txtSalarioFunc.requestFocus();
        return;
    }
    // Para aceitar vírgula como separador decimal (comum em PT-BR), você pode substituir vírgula por ponto.
    // Ou configurar o Locale para o parseador, mas substituir é mais direto para este caso.
    salario = Double.parseDouble(salarioStr.replace(',', '.'));
    if (salario < 0) {
        JOptionPane.showMessageDialog(this, "Salário não pode ser negativo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
        txtSalarioFunc.requestFocus();
        return;
    }
} catch (NumberFormatException e) {
    JOptionPane.showMessageDialog(this, "Salário deve ser um número válido (ex: 150000.00 ou 150000,00).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
    txtSalarioFunc.requestFocus();
    return;
}

// ... continue com as outras validações ...

// Se todas as validações passaram, use as variáveis convertidas:
// Por exemplo, ao adicionar à tabela, você pode usar os valores numéricos ou
// a representação String original, dependendo de como sua JTable é configurada.
DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
Object[] row = new Object[8];
row[0] = idFunc; // Usando o int convertido
row[1] = nomeCompleto;
row[2] = numeroBilhete;
row[3] = cargoFuncao;
row[4] = telefone;
row[5] = email;
row[6] = salario; // Usando o double convertido
row[7] = dataContratacaoStr; // Ou a data formatada, se preferir exibir assim

model.addRow(row);
// ...

Ponto crucial:

Sempre faça a conversão dentro de um bloco try-catch para NumberFormatException quando esperar uma entrada numérica de um JTextField. Isso protege seu programa de travar caso o usuário digite texto onde deveria haver números.

Ok, entendi perfeitamente sua necessidade! Você quer:

  1. Limitar o número de caracteres que podem ser digitados em cada JTextField e JTextArea, com limites específicos para campos numéricos (ex: 9 caracteres) e campos de texto (ex: 20 caracteres).
  2. Saber onde corrigir o código fornecido.
  3. Perguntou se é possível criar um método isValidCamp para isso.

A boa notícia é que já abordamos a solução para o ponto 1 e 3! A classe DocumentFilter é exatamente a ferramenta ideal para "limitar os campos a serem preenchidos, tipo só pode ter 9 caracteres, seja ele número e string, só pode ter 20 caracteres, ele só pode escrever até 20 caracteres e depois disso não dê mais para escrever".

Você já tem o LengthRestrictedDocumentFilter que eu te dei, e ele faz exatamente isso. Agora, vamos aplicá-lo em todos os seus campos JTextField e JTextArea no método initComponents() ou no construtor da sua TelaCadatroFuncionario.

Onde corrigir e implementar as validações de comprimento

A correção principal é adicionar as chamadas para setDocumentFilter no construtor da sua classe TelaCadatroFuncionario. Você já tem o esqueleto disso no seu código fornecido.

Vamos integrar as chamadas que faltam e ajustar os comprimentos.

Passos:

  1. Certifique-se de que a classe LengthRestrictedDocumentFilter.java está no pacote telas (conforme a resposta anterior).

  2. No construtor da TelaCadatroFuncionario, adicione as linhas para aplicar o DocumentFilter a cada campo. Eu vou te mostrar onde no seu código.

Seu código atual (linha 30-35 do seu snippet):

Java
package telas;

import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.UIManager;
import javax.swing.text.AbstractDocument; // <<< Adicione este import


public class TelaCadatroFuncionario extends javax.swing.JFrame
{
    // ... (suas declarações de variáveis) ...

    public TelaCadatroFuncionario()
    {
        initComponents();
        setLocationRelativeTo(null);
        bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]
        {
           "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });

        // >>>>>>>>>>>>> CORREÇÃO/ADICIONAR AQUI AS LINHAS DO DOCUMENTFILTER <<<<<<<<<<<<<
        // Abaixo da linha 35, adicione as chamadas para setDocumentFilter
        // Para usar o DocumentFilter, precisamos do AbstractDocument
        // Importe: import javax.swing.text.AbstractDocument; no topo do arquivo.

        // Exemplos de limites que você mencionou:
        // ID: 9 caracteres (números)
        ((AbstractDocument) txtIDFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(9));

        // Nome Completo: 20 caracteres (você disse 20 para strings em geral)
        ((AbstractDocument) txtNomeCompletoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100)); // Ajustei para 100, 20 é muito pouco para um nome completo

        // Número de Bilhete: Exemplo 14 caracteres (formato angolano 999999999AA999)
        ((AbstractDocument) txtNumeroBilheteFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(14));

        // Data de Nascimento: 10 caracteres (dd/MM/yyyy)
        ((AbstractDocument) txtDataNascimentoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));

        // Telefone: 15 caracteres (para incluir ddd e possíveis hífens/espaços)
        ((AbstractDocument) txtTelefoneFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(15));

        // Email: 100 caracteres (emails podem ser longos)
        ((AbstractDocument) txtEmailFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100));

        // Cargo/Função: 50 caracteres
        ((AbstractDocument) txtCargoFuncaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(50));

        // Data Contratação: 10 caracteres (dd/MM/yyyy)
        ((AbstractDocument) txtDataContratacaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));

        // Salário: 15 caracteres (pode ter muitos dígitos e vírgulas/pontos)
        ((AbstractDocument) txtSalarioFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(15));

        // Endereço: 200 caracteres
        ((AbstractDocument) txtEnderecoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(200));

        // Observações (JTextArea): 500 caracteres (para texto mais longo)
        ((AbstractDocument) txtObservacoes.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(500));
    }
    // ... (resto do seu código) ...

Explicação:

  • import javax.swing.text.AbstractDocument;: Você precisa importar essa classe porque o método getDocument() de JTextField (e JTextArea) retorna um Document, mas para aplicar um DocumentFilter, você precisa que ele seja um AbstractDocument. A conversão (AbstractDocument) txtIDFunc.getDocument() faz isso.
  • ((AbstractDocument) txtIDFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(9));: Para cada campo, você está pegando o Document associado a ele, fazendo um "cast" para AbstractDocument e então chamando setDocumentFilter() para aplicar uma nova instância do seu filtro de comprimento, passando o número máximo de caracteres desejado.
  • Limites de Caracteres:
    • 9 caracteres para números: Usei 9 para txtIDFunc.
    • 20 caracteres para strings: Para o txtNomeCompletoFunc, eu sugiro um valor maior (ex: 100) porque 20 caracteres é muito pouco para um nome completo. Se você realmente quiser 20, basta mudar o número. Adapte os outros campos de texto para valores razoáveis para a informação que eles representam (email, endereço, cargo, etc.).

Como isso atende sua necessidade "não dê mais para escrever"

O DocumentFilter age antes que o texto seja inserido. Se o usuário tentar digitar o 10º caractere em um campo limitado a 9, o método insertString (ou replace) do seu LengthRestrictedDocumentFilter verá que (fb.getDocument().getLength() + str.length()) será maior que maxLength. Como sua lógica lá impede a chamada a super.insertString(), o caractere simplesmente não será inserido, e o usuário não poderá digitar mais do que o limite, sem precisar de mensagens de erro ou validações adicionais.

Não há necessidade de um isValidCamp para limitar caracteres

A função isValidCamp que você pensou é mais comum para validar o conteúdo depois que ele foi digitado (por exemplo, se é um número, se é um email válido, etc.), ou para verificar se o campo está vazio.

Para limitar o número de caracteres permitidos na entrada em tempo real, o DocumentFilter é a solução padrão e mais elegante no Swing. Ele lida com a entrada do usuário de forma reativa, impedindo que o texto inválido (no caso, muito longo) sequer apareça no campo.

Continue utilizando as validações que você já tem no bnAdicionarActionPerformed para verificar:

  • Campos vazios.
  • Formato de datas.
  • Valores numéricos (try-catch para NumberFormatException).
  • Idade mínima.
  • Formato de email com regex (se for implementar).
  • Formato de bilhete com regex (se for implementar).

O DocumentFilter e essas validações em conjunto formam um sistema robusto para tratar a entrada do usuário.

passo a passo

Entendi! Vamos fazer um passo a passo claro para implementar o DocumentFilter e as validações nos seus campos.

Objetivo: Limitar a quantidade de caracteres que o usuário pode digitar em cada campo (o que você chamou de isValidCamp para limitar, e eu expliquei que é feito com DocumentFilter), e também garantir que os campos numéricos sejam de fato numéricos e as datas sejam válidas.


Passo 1: Criar a classe LengthRestrictedDocumentFilter

Esta classe será responsável por limitar o número de caracteres em qualquer campo de texto ao qual ela for aplicada.

  1. No NetBeans (ou seu IDE):

    • Vá até a pasta src/telas (ou Source Packages -> telas).
    • Clique com o botão direito na pasta telas.
    • Selecione New > Java Class...
    • No campo "Class Name:", digite LengthRestrictedDocumentFilter.
    • Clique em "Finish".
  2. Copie e cole o código abaixo no arquivo LengthRestrictedDocumentFilter.java que foi criado, substituindo todo o conteúdo existente:

    Java
    package telas;
    
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DocumentFilter;
    
    /**
     * Um DocumentFilter que restringe o número máximo de caracteres permitidos
     * em um componente de texto (JTextField, JTextArea, etc.).
     */
    public class LengthRestrictedDocumentFilter extends DocumentFilter {
        private int maxLength;
    
        public LengthRestrictedDocumentFilter(int maxLength) {
            this.maxLength = maxLength;
        }
    
        @Override
        public void insertString(FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException {
            // Verifica se o comprimento total (atual + novo texto) não excede o maxLength
            if (str == null) return; // Proteção para caso o texto seja nulo
            if ((fb.getDocument().getLength() + str.length()) <= maxLength) {
                super.insertString(fb, offset, str, attr); // Se sim, permite a inserção
            }
            // Se não, não faz nada, impedindo a inserção
        }
    
        @Override
        public void replace(FilterBypass fb, int offset, int length, String str, AttributeSet attrs) throws BadLocationException {
            // Verifica se o comprimento total (atual - texto a ser substituído + novo texto) não excede o maxLength
            if (str == null) str = ""; // Garante que str não seja nulo para cálculo de length
            if ((fb.getDocument().getLength() - length + str.length()) <= maxLength) {
                super.replace(fb, offset, length, str, attrs); // Se sim, permite a substituição
            }
            // Se não, não faz nada
        }
    
        @Override
        public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
            // A remoção de caracteres geralmente não precisa de restrição de comprimento,
            // então ela é sempre permitida.
            super.remove(fb, offset, length);
        }
    }
    

Passo 2: Aplicar o DocumentFilter na TelaCadatroFuncionario

Agora, vamos usar a classe LengthRestrictedDocumentFilter que você acabou de criar.

  1. Abra o arquivo TelaCadatroFuncionario.java no seu projeto.

  2. Adicione um import necessário no topo do arquivo (se ainda não estiver lá), logo abaixo dos outros imports:

    Java
    import javax.swing.text.AbstractDocument; // <<< Adicione esta linha
    
  3. Localize o construtor da sua classe TelaCadatroFuncionario. É o método que começa com public TelaCadatroFuncionario() { ... }.

    • Procure por esta parte no seu código:

      Java
      public TelaCadatroFuncionario()
      {
          initComponents();
          setLocationRelativeTo(null);
          bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
          DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
          model.setColumnIdentifiers(new Object[]
          {
             "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
          });
          // O código para aplicar os filtros virá AQUI ABAIXO
      }
      
  4. Abaixo da linha model.setColumnIdentifiers(...), adicione as chamadas para setDocumentFilter para cada um dos seus campos de texto (JTextField e JTextArea).

    • Importante: Ajuste o maxLength para cada campo de acordo com o que você deseja. Os exemplos abaixo são sugestões razoáveis.
    Java
    public TelaCadatroFuncionario()
    {
        initComponents();
        setLocationRelativeTo(null);
        bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]
        {
           "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });
    
        // --- APLICANDO LIMITES DE CARACTERES COM DocumentFilter ---
        // ID: por exemplo, 9 caracteres para um número de ID
        ((AbstractDocument) txtIDFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(9));
    
        // Nome Completo: por exemplo, 100 caracteres
        ((AbstractDocument) txtNomeCompletoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100));
    
        // Número de Bilhete: por exemplo, 14 caracteres (formato angolano 999999999AA999)
        ((AbstractDocument) txtNumeroBilheteFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(14));
    
        // Data de Nascimento: 10 caracteres (dd/MM/yyyy)
        ((AbstractDocument) txtDataNascimentoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));
    
        // Telefone: 15 caracteres (para incluir código do país, DDD, etc.)
        ((AbstractDocument) txtTelefoneFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(15));
    
        // Email: 100 caracteres (emails podem ser longos)
        ((AbstractDocument) txtEmailFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100));
    
        // Cargo/Função: 50 caracteres
        ((AbstractDocument) txtCargoFuncaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(50));
    
        // Data Contratação: 10 caracteres (dd/MM/yyyy)
        ((AbstractDocument) txtDataContratacaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));
    
        // Salário: 15 caracteres (pode ter valores altos, casas decimais)
        ((AbstractDocument) txtSalarioFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(15));
    
        // Endereço: 200 caracteres (endereços podem ser longos)
        ((AbstractDocument) txtEnderecoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(200));
    
        // Observações (JTextArea): 500 caracteres
        ((AbstractDocument) txtObservacoes.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(500));
        // --- FIM DA APLICAÇÃO DOS DocumentFilters ---
    }
    

Passo 3: Implementar Validações de Conteúdo e Conversão no bnAdicionarActionPerformed

Este passo é para validar o formato e o tipo dos dados depois que o usuário tentou adicionar. É aqui que você verifica se um campo que deveria ser número realmente é número, ou se uma data está no formato correto e não é futura, etc.

  1. Localize o método bnAdicionarActionPerformed no seu arquivo TelaCadatroFuncionario.java.

  2. Dentro deste método, adicione o código de validação e conversão para cada campo conforme mostrado abaixo. Substitua as partes existentes de validação (se houver) por este código mais completo.

    Java
    private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        // --- 1. Obtenção dos dados dos campos (trim() para remover espaços em branco) ---
        String idStr = txtIDFunc.getText().trim();
        String nomeCompleto = txtNomeCompleptoFunc.getText().trim(); // Corrigido o nome do campo
        String numeroBilhete = txtNumeroBilheteFunc.getText().trim();
        String dataNascimentoStr = txtDataNascimentoFunc.getText().trim();
        String telefone = txtTelefoneFunc.getText().trim();
        String email = txtEmailFunc.getText().trim();
        String cargoFuncao = txtCargoFuncaoFunc.getText().trim();
        String dataContratacaoStr = txtDataContratacaoFunc.getText().trim();
        String salarioStr = txtSalarioFunc.getText().trim();
        String endereco = txtEnderecoFunc.getText().trim();
        String observacoes = txtObservacoes.getText().trim();
    
        // Variável para armazenar o sexo selecionado
        String sexo = "";
        if (rbMasculino.isSelected()) {
            sexo = "Masculino";
        } else if (rbFeminino.isSelected()) {
            sexo = "Feminino";
        } else if (jRadioButton3.isSelected()) { // Se "outros" for uma opção válida
            sexo = "Outros";
        }
    
        // --- 2. Validação de Campos Obrigatórios (todos os que não podem ser vazios) ---
        // Comece pelas validações mais básicas: campos vazios.
        if (idStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'ID' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtIDFunc.requestFocus();
            return;
        }
        if (nomeCompleto.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Nome Completo' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtNomeCompletoFunc.requestFocus();
            return;
        }
        if (numeroBilhete.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Nº de Bilhete' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtNumeroBilheteFunc.requestFocus();
            return;
        }
        if (dataNascimentoStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Data Nasc.' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtDataNascimentoFunc.requestFocus();
            return;
        }
        if (telefone.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Telefone' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtTelefoneFunc.requestFocus();
            return;
        }
        if (email.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Email' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtEmailFunc.requestFocus();
            return;
        }
        if (cargoFuncao.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Cargo/Função' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtCargoFuncaoFunc.requestFocus();
            return;
        }
        if (dataContratacaoStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Data Contratação' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtDataContratacaoFunc.requestFocus();
            return;
        }
        if (salarioStr.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Salário' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtSalarioFunc.requestFocus();
            return;
        }
        if (endereco.isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo 'Endereço' é obrigatório.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            txtEnderecoFunc.requestFocus();
            return;
        }
        if (sexo.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Selecione o 'Sexo' do funcionário.", "Campo Vazio", JOptionPane.WARNING_MESSAGE);
            rbMasculino.requestFocusInWindow(); // Coloca o foco no primeiro radio button do grupo
            return;
        }
    
        // --- 3. Validação e Conversão do ID (int) ---
        int idFunc;
        try {
            idFunc = Integer.parseInt(idStr);
            if (idFunc <= 0) {
                JOptionPane.showMessageDialog(this, "ID deve ser um número inteiro positivo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtIDFunc.requestFocus();
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "ID deve conter apenas números inteiros válidos.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtIDFunc.requestFocus();
            return;
        }
    
        // --- 4. Validação de Email (formato básico) ---
        // Você pode refinar esta regex para ser mais rigorosa se necessário.
        String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
        Pattern pattern = Pattern.compile(emailRegex);
        Matcher matcher = pattern.matcher(email);
        if (!matcher.matches()) {
            JOptionPane.showMessageDialog(this, "Formato de Email inválido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtEmailFunc.requestFocus();
            return;
        }
    
        // --- 5. Validação de Data de Nascimento (formato dd/MM/yyyy e idade mínima) ---
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.setLenient(false); // CRUCIAL: Impede datas inválidas como 31/02 ou 30/02/2023.
        Date dataNasc = null; // Inicialize fora do try para que possa ser usada depois
        try {
            dataNasc = dateFormat.parse(dataNascimentoStr);
    
            // Validação 5.1: Data não pode ser no futuro
            Date hoje = new Date(); // Data atual
            if (dataNasc.after(hoje)) {
                JOptionPane.showMessageDialog(this, "Data de Nascimento não pode ser uma data futura.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtDataNascimentoFunc.requestFocus();
                return;
            }
    
            // Validação 5.2: Idade Mínima (ex: 18 anos)
            java.util.Calendar calNasc = java.util.Calendar.getInstance();
            calNasc.setTime(dataNasc);
    
            java.util.Calendar calHoje = java.util.Calendar.getInstance();
            calHoje.setTime(hoje);
    
            int idade = calHoje.get(java.util.Calendar.YEAR) - calNasc.get(java.util.Calendar.YEAR);
    
            if (calNasc.get(java.util.Calendar.MONTH) > calHoje.get(java.util.Calendar.MONTH) ||
                (calNasc.get(java.util.Calendar.MONTH) == calHoje.get(java.util.Calendar.MONTH) &&
                 calNasc.get(java.util.Calendar.DAY_OF_MONTH) > calHoje.get(java.util.Calendar.DAY_OF_MONTH))) {
                idade--;
            }
    
            int idadeMinima = 18; // Idade mínima para funcionário
            if (idade < idadeMinima) {
                JOptionPane.showMessageDialog(this, "O funcionário deve ter no mínimo " + idadeMinima + " anos de idade.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtDataNascimentoFunc.requestFocus();
                return;
            }
    
        } catch (ParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use dd/MM/yyyy (ex: 12/07/2002).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtDataNascimentoFunc.requestFocus();
            return;
        }
    
        // --- 6. Validação de Data de Contratação (formato dd/MM/yyyy e não pode ser futura) ---
        Date dataContratacao = null; // Inicialize fora do try
        try {
            dataContratacao = dateFormat.parse(dataContratacaoStr); // Usar o mesmo dateFormat, se o formato for igual
    
            // Validação 6.1: Data não pode ser no futuro
            Date hoje = new Date();
            if (dataContratacao.after(hoje)) {
                JOptionPane.showMessageDialog(this, "Data de Contratação não pode ser uma data futura.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtDataContratacaoFunc.requestFocus();
                return;
            }
    
            // Validação 6.2: Data de contratação não pode ser anterior à data de nascimento
            if (dataContratacao.before(dataNasc)) {
                JOptionPane.showMessageDialog(this, "Data de Contratação não pode ser anterior à Data de Nascimento.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtDataContratacaoFunc.requestFocus();
                return;
            }
    
        } catch (ParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Contratação inválido. Use dd/MM/yyyy (ex: 18/06/2025).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtDataContratacaoFunc.requestFocus();
            return;
        }
    
        // --- 7. Validação e Conversão do Salário (double) ---
        double salario;
        try {
            // Permite vírgula como separador decimal para o usuário, mas converte para ponto para Double.parseDouble
            salario = Double.parseDouble(salarioStr.replace(',', '.'));
            if (salario < 0) {
                JOptionPane.showMessageDialog(this, "Salário não pode ser um valor negativo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                txtSalarioFunc.requestFocus();
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Salário deve ser um número válido (ex: 150000.00 ou 150000,00).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtSalarioFunc.requestFocus();
            return;
        }
    
        // --- 8. Validação de Nº de Bilhete (exemplo de formato angolano) ---
        // Exemplo: 9 dígitos, 2 letras, 3 dígitos (000000000AA000)
        // Ajuste esta regex se o formato for diferente
        String bilheteRegex = "^\\d{9}[A-Z]{2}\\d{3}$";
        Pattern bilhetePattern = Pattern.compile(bilheteRegex);
        Matcher bilheteMatcher = bilhetePattern.matcher(numeroBilhete);
        if (!bilheteMatcher.matches()) {
            JOptionPane.showMessageDialog(this, "Formato de Nº de Bilhete inválido. Use 9 dígitos, 2 letras, 3 dígitos (Ex: 000000000AB000).", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            txtNumeroBilheteFunc.requestFocus();
            return;
        }
    
    
        // --- SE TODAS AS VALIDAÇÕES PASSARAM, PROSSIGA PARA ADICIONAR À TABELA ---
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        Object[] row = new Object[8]; // Oito colunas como definido no setColumnIdentifiers
        row[0] = idFunc; // ID (int)
        row[1] = nomeCompleto; // Nome Completo (String)
        row[2] = numeroBilhete; // Nº de Bilhete (String)
        row[3] = cargoFuncao; // Cargo (String)
        row[4] = telefone; // Telefone (String)
        row[5] = email; // Email (String)
        row[6] = salario; // Salário (double)
        row[7] = dateFormat.format(dataContratacao); // Data Contratação (String formatada para exibição)
    
        model.addRow(row);
    
        // Limpar campos após adicionar (opcional)
        // ... (seu código para limpar campos aqui) ...
    
        JOptionPane.showMessageDialog(this, "Funcionário adicionado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
    }
    

Passo 4: Rodar e Testar

  1. Salve todos os arquivos (LengthRestrictedDocumentFilter.java e TelaCadatroFuncionario.java).
  2. No NetBeans, clique com o botão direito no seu projeto (SistemaGestaoHoteleiro) e selecione Clean and Build para recompilar tudo.
  3. Execute o projeto (botão verde de "Play" ou clique com o direito no projeto e Run).

O que você deve observar ao testar:

  • Limite de caracteres: Ao digitar nos campos, você não deve conseguir exceder o número de caracteres que você definiu para cada um.
  • Campos vazios: Tente adicionar sem preencher um campo obrigatório. Você deve receber a mensagem de "Campo Vazio".
  • ID: Digite letras no campo ID. Você deve receber a mensagem de "ID deve conter apenas números inteiros válidos.". Digite um ID negativo ou zero.
  • Data de Nascimento:
    • Digite um formato incorreto (ex: 12-07-2002, 12/7/2002).
    • Digite uma data inválida (ex: 31/02/2023).
    • Digite uma data futura (ex: 12/07/2026).
    • Digite uma data que resulte em idade menor que 18 anos.
  • Data de Contratação:
    • Digite uma data futura.
    • Digite uma data anterior à data de nascimento.
  • Salário: Digite letras no campo Salário. Digite um valor negativo. Tente com vírgula e com ponto decimal.
  • Email: Digite um email sem @ ou sem o .com.
  • Nº de Bilhete: Digite um formato incorreto que não siga 9 dígitos, 2 letras, 3 dígitos.

Com esses passos, você terá uma validação robusta e um controle de entrada de dados muito melhor na sua aplicação!

Ótimo! Vejo que você já integrou o LengthRestrictedDocumentFilter no construtor da sua TelaCadatroFuncionario, o que é um excelente começo.

Agora, o próximo passo é implementar as validações de conteúdo e conversão dos dados no método bnAdicionarActionPerformed, conforme o passo 3 que te passei anteriormente.

Com base no código que você me enviou, vou te mostrar exatamente onde colocar e como ficaria o seu método bnAdicionarActionPerformed para incluir todas as validações.

Instruções:

  1. Localize no seu código o método bnAdicionarActionPerformed. Ele deve estar parecido com isso (ou talvez com menos validações):

    Java
    private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        // Seu código atual dentro deste método
    }
    
  2. Substitua TODO o conteúdo desse método pelo código que vou te fornecer abaixo. Este código já inclui a obtenção dos dados, as validações de campos vazios, ID, Email, Data de Nascimento, Data de Contratação, Salário e o Número de Bilhete, além da lógica para adicionar à tabela se todas as validações passarem.


Java
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
package telas;

import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.UIManager;
import javax.swing.text.AbstractDocument;


public class TelaCadatroFuncionario extends javax.swing.JFrame
{
    //private javax.swing.JRadioButton rbFeminino;
    //private javax.swing.JRadioButton rbMasculino;
    
    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName());
     private int maxLength;
    
    public TelaCadatroFuncionario()
{
    initComponents();
    setLocationRelativeTo(null);
    bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
    DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
    model.setColumnIdentifiers(new Object[]
    {
       "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
    });

    // --- APLICANDO LIMITES DE CARACTERES COM DocumentFilter ---
    // ID: por exemplo, 9 caracteres para um número de ID
    ((AbstractDocument) txtIDFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(9));

    // Nome Completo: por exemplo, 100 caracteres
    ((AbstractDocument) txtNomeCompletoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(60));

    // Número de Bilhete: por exemplo, 14 caracteres (formato angolano 999999999AA999)
    ((AbstractDocument) txtNumeroBilheteFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(14));

    // Data de Nascimento: 10 caracteres (dd/MM/yyyy)
    ((AbstractDocument) txtDataNascimentoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));

    // Telefone: 15 caracteres (para incluir código do país, DDD, etc.)
    ((AbstractDocument) txtTelefoneFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(15));

    // Email: 100 caracteres (emails podem ser longos)
    ((AbstractDocument) txtEmailFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100));

    // Cargo/Função: 50 caracteres
    ((AbstractDocument) txtCargoFuncaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(50));

    // Data Contratação: 10 caracteres (dd/MM/yyyy)
    ((AbstractDocument) txtDataContratacaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));

    // Salário: 15 caracteres (pode ter valores altos, casas decimais)
    ((AbstractDocument) txtSalarioFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(15));

    // Endereço: 200 caracteres (endereços podem ser longos)
    ((AbstractDocument) txtEnderecoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(200));

    // Observações (JTextArea): 500 caracteres
    ((AbstractDocument) txtObservacoes.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(500));
    // --- FIM DA APLICAÇÃO DOS DocumentFilters ---
}
    
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        buttonGroupSexo = new javax.swing.ButtonGroup();
        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalFuncionarios = new javax.swing.JPanel();
        jScrollPaneTabelaFuncionarios = new javax.swing.JScrollPane();
        jTableFuncionarios = new javax.swing.JTable();
        LOGO = new javax.swing.JLabel();
        tITULO = new javax.swing.JLabel();
        lblNomeCompleto = new javax.swing.JLabel();
        lblID = new javax.swing.JLabel();
        lblNumeroBilhete = new javax.swing.JLabel();
        lblDataNascimento = new javax.swing.JLabel();
        lblTelefone = new javax.swing.JLabel();
        lblEmail = new javax.swing.JLabel();
        lblCargoFuncao = new javax.swing.JLabel();
        lblDataContratacao = new javax.swing.JLabel();
        lblSalario = new javax.swing.JLabel();
        lblEndereco = new javax.swing.JLabel();
        lblSexo = new javax.swing.JLabel();
        bnAdicionar = new javax.swing.JButton();
        bnAtualizar = new javax.swing.JButton();
        bnExcluir = new javax.swing.JButton();
        txtIDFunc = new javax.swing.JTextField();
        txtNomeCompletoFunc = new javax.swing.JTextField();
        txtNumeroBilheteFunc = new javax.swing.JTextField();
        txtDataNascimentoFunc = new javax.swing.JTextField();
        txtTelefoneFunc = new javax.swing.JTextField();
        txtEmailFunc = new javax.swing.JTextField();
        txtCargoFuncaoFunc = new javax.swing.JTextField();
        txtDataContratacaoFunc = new javax.swing.JTextField();
        txtSalarioFunc = new javax.swing.JTextField();
        txtEnderecoFunc = new javax.swing.JTextField();
        jScrollPaneObservacoesFunc = new javax.swing.JPanel();
        painelObservacoesFunc = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnLimparID = new javax.swing.JButton();
        btnLimparNome = new javax.swing.JButton();
        btnLimparBilhete = new javax.swing.JButton();
        btnLimparNascimento = new javax.swing.JButton();
        btnLimparTelefone = new javax.swing.JButton();
        btnLimparEmail = new javax.swing.JButton();
        btnLimparCargoFuncao = new javax.swing.JButton();
        btnLimparDataContracao = new javax.swing.JButton();
        btnLimparSalario = new javax.swing.JButton();
        btnLimparEndereco = new javax.swing.JButton();
        bnVoltar = new javax.swing.JButton();
        lblObservacoes = new javax.swing.JLabel();
        rbMasculino = new javax.swing.JRadioButton();
        rbFeminino = new javax.swing.JRadioButton();
        jRadioButton3 = new javax.swing.JRadioButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jScrollPaneTabelaFuncionarios.setPreferredSize(new java.awt.Dimension(850, 250));

        jTableFuncionarios.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null}
            },
            new String [] {
                "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Object.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        jScrollPaneTabelaFuncionarios.setViewportView(jTableFuncionarios);

        LOGO.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        tITULO.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        tITULO.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        tITULO.setText("Gestão de Funcionários");

        lblNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNomeCompleto.setText("Nome Completo");

        lblID.setFont(new java.awt.Font("Liberation Sans", 0, 18)); // NOI18N
        lblID.setText("Id");

        lblNumeroBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNumeroBilhete.setText("Nº de Bilhete");

        lblDataNascimento.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataNascimento.setText("Data Nasc.:");

        lblTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblTelefone.setText("Telefone");

        lblEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEmail.setText("Email");

        lblCargoFuncao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblCargoFuncao.setText("Cargo/Função");

        lblDataContratacao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataContratacao.setText("Data Contratação");

        lblSalario.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSalario.setText("Salário");

        lblEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEndereco.setText("Endereço");

        lblSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSexo.setText("Sexo");

        bnAdicionar.setText("Adicionar");
        bnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAdicionarActionPerformed(evt);
            }
        });

        bnAtualizar.setText("Atualizar");
        bnAtualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAtualizarActionPerformed(evt);
            }
        });

        bnExcluir.setText("Excluir");
        bnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnExcluirActionPerformed(evt);
            }
        });

        txtIDFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtIDFuncActionPerformed(evt);
            }
        });

        txtNomeCompletoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNomeCompletoFuncActionPerformed(evt);
            }
        });

        txtDataNascimentoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataNascimentoFuncActionPerformed(evt);
            }
        });

        txtTelefoneFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtTelefoneFuncActionPerformed(evt);
            }
        });

        txtEmailFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtEmailFuncActionPerformed(evt);
            }
        });

        txtCargoFuncaoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtCargoFuncaoFuncActionPerformed(evt);
            }
        });

        txtDataContratacaoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataContratacaoFuncActionPerformed(evt);
            }
        });

        txtSalarioFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtSalarioFuncActionPerformed(evt);
            }
        });

        txtEnderecoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtEnderecoFuncActionPerformed(evt);
            }
        });

        txtObservacoes.setColumns(20);
        txtObservacoes.setRows(5);
        painelObservacoesFunc.setViewportView(txtObservacoes);

        javax.swing.GroupLayout jScrollPaneObservacoesFuncLayout = new javax.swing.GroupLayout(jScrollPaneObservacoesFunc);
        jScrollPaneObservacoesFunc.setLayout(jScrollPaneObservacoesFuncLayout);
        jScrollPaneObservacoesFuncLayout.setHorizontalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jScrollPaneObservacoesFuncLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(17, 17, 17))
        );
        jScrollPaneObservacoesFuncLayout.setVerticalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.Alignment.TRAILING)
        );

        btnLimparID.setText("Limpar");
        btnLimparID.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparIDActionPerformed(evt);
            }
        });

        btnLimparNome.setText("Limpar");
        btnLimparNome.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNomeActionPerformed(evt);
            }
        });

        btnLimparBilhete.setText("Limpar");
        btnLimparBilhete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparBilheteActionPerformed(evt);
            }
        });

        btnLimparNascimento.setText("Limpar");
        btnLimparNascimento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNascimentoActionPerformed(evt);
            }
        });

        btnLimparTelefone.setText("Limpar");
        btnLimparTelefone.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparTelefoneActionPerformed(evt);
            }
        });

        btnLimparEmail.setText("Limpar");
        btnLimparEmail.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEmailActionPerformed(evt);
            }
        });

        btnLimparCargoFuncao.setText("Limpar");
        btnLimparCargoFuncao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparCargoFuncaoActionPerformed(evt);
            }
        });

        btnLimparDataContracao.setText("Limpar");
        btnLimparDataContracao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparDataContracaoActionPerformed(evt);
            }
        });

        btnLimparSalario.setText("Limpar");
        btnLimparSalario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparSalarioActionPerformed(evt);
            }
        });

        btnLimparEndereco.setText("Limpar");
        btnLimparEndereco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEnderecoActionPerformed(evt);
            }
        });

        bnVoltar.setText("Voltar");
        bnVoltar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnVoltarActionPerformed(evt);
            }
        });

        lblObservacoes.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblObservacoes.setText("Observações");

        rbMasculino.setBackground(new java.awt.Color(15

esta a vir erro aqui  String nomeCompleto = txtDataNascimentoFunc.setText("").getText().trim();

Aha! Sim, esse é um erro clássico e eu entendi perfeitamente o que está acontecendo.

A linha que você apontou: String nomeCompleto = txtDataNascimentoFunc.setText("").getText().trim();

O problema:

  • txtDataNascimentoFunc.setText(""): Este método retorna void (nada). Ele serve para definir o texto de um campo, não para retornar o próprio campo ou seu texto.
  • Quando você tenta chamar .getText().trim() em um resultado void, o Java dá um erro de compilação porque void não tem os métodos getText() ou trim().

Seu objetivo provável:

Parece que você queria:

  1. Obter o texto do campo txtNomeCompletoFunc.
  2. Limpar o campo txtDataNascimentoFunc (ou algum outro campo, talvez até o txtNomeCompletoFunc depois de obter o valor).

Como corrigir (e o que você provavelmente queria):

Vamos separar as operações. Primeiro, obtenha o texto do campo correto e depois, se necessário, limpe os campos.

Correção provável #1: Você queria pegar o nome completo e acidentalmente usou txtDataNascimentoFunc e o .setText("")

Se você queria pegar o nomeCompleto do campo txtNomeCompletoFunc, a linha deveria ser simplesmente:

Java
String nomeCompleto = txtNomeCompletoFunc.getText().trim(); // Correto para obter o nome

E se você também queria limpar o campo txtDataNascimentoFunc, faria isso em uma linha separada, depois de ter pego os valores necessários:

Java
// ... depois de obter todos os valores
txtDataNascimentoFunc.setText(""); // Para limpar o campo da data de nascimento
// ... e talvez outros campos

Correção provável #2: Você queria pegar o nome completo, e depois limpar o campo do nome completo, mas de forma errada.

Se a ideia era pegar o nome completo e logo em seguida limpar o mesmo campo, ainda assim o .setText("") não pode estar no meio da cadeia de chamadas:

Java
String nomeCompleto = txtNomeCompletoFunc.getText().trim(); // Pega o nome completo
txtNomeCompletoFunc.setText(""); // Limpa o campo do nome completo

Com base no seu código anterior e no contexto, a linha problemática String nomeCompleto = txtDataNascimentoFunc.setText("").getText().trim(); foi um engano. A linha correta para obter o nome completo é String nomeCompleto = txtNomeCompleptoFunc.getText().trim(); (que já estava no meu código de exemplo e que você já tem no seu).

Verifique o seu método bnAdicionarActionPerformed e certifique-se de que a obtenção de cada valor dos campos está sendo feita da maneira correta: tipoVariavel nomeVariavel = seuCampoJTextField.getText().trim();

E o código para limpar os campos (que geralmente vai depois de todas as validações e da adição à tabela) seria simplesmente:

Java
txtIDFunc.setText("");
txtNomeCompletoFunc.setText("");
txtNumeroBilheteFunc.setText("");
txtDataNascimentoFunc.setText("");
txtTelefoneFunc.setText("");
txtEmailFunc.setText("");
txtCargoFuncaoFunc.setText("");
txtDataContratacaoFunc.setText("");
txtSalarioFunc.setText("");
txtEnderecoFunc.setText("");
txtObservacoes.setText("");
buttonGroupSexo.clearSelection(); // Para desmarcar os radio buttons
txtIDFunc.requestFocus(); // Coloca o foco no primeiro campo novamente

Por favor, confirme qual era a sua intenção exata com aquela linha, mas o mais provável é que você só precise remover o .setText("") da cadeia e garantir que está pegando o texto do txtNomeCompletoFunc para a variável nomeCompleto.

Ok, entendi perfeitamente sua necessidade! Você quer refinar a validação dos campos:

  • Para Strings (texto como Nome, Cargo, Endereço): Ignorar espaços em branco no início e no fim (trim()), mas permitir espaços no meio da string.
  • Para Números (ID, Telefone, Salário):
    • Não aceitar espaços em hipótese alguma.
    • Aceitar apenas dígitos (números).

Vamos implementar isso usando DocumentFilters mais específicos e, no caso das Strings, mantendo o trim() na obtenção dos valores.

Primeiro, você já tem a classe LengthRestrictedDocumentFilter. Vamos precisar de um novo DocumentFilter para campos numéricos que restrinja a entrada apenas a dígitos e proíba espaços.

Passo 1: Crie uma nova classe NumberOnlyDocumentFilter.java

Esta classe vai estender DocumentFilter e sobrescrever os métodos para permitir apenas dígitos e proibir espaços.

Java
package telas; // Certifique-se de que está no mesmo pacote

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class NumberOnlyDocumentFilter extends DocumentFilter {
    private int maxLength;

    public NumberOnlyDocumentFilter(int maxLength) {
        this.maxLength = maxLength;
    }

    @Override
    public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
        if (string == null) {
            return;
        }

        // Remove quaisquer caracteres que não sejam dígitos
        String filteredString = string.replaceAll("[^0-9]", "");

        // Calcula o tamanho da string resultante após a inserção
        int currentLength = fb.getDocument().getLength();
        int newLength = currentLength + filteredString.length();

        if (newLength <= maxLength) {
            super.insertString(fb, offset, filteredString, attr);
        } else {
            // Se exceder o comprimento máximo, insere apenas o que couber
            int charsToInsert = maxLength - currentLength;
            if (charsToInsert > 0) {
                super.insertString(fb, offset, filteredString.substring(0, charsToInsert), attr);
            }
        }
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        if (text == null) {
            super.replace(fb, offset, length, text, attrs);
            return;
        }

        // Remove quaisquer caracteres que não sejam dígitos
        String filteredText = text.replaceAll("[^0-9]", "");

        // Calcula o tamanho da string resultante após a substituição
        int currentLength = fb.getDocument().getLength();
        int newLength = currentLength - length + filteredText.length();

        if (newLength <= maxLength) {
            super.replace(fb, offset, length, filteredText, attrs);
        } else {
            // Se exceder o comprimento máximo, insere apenas o que couber
            int charsToInsert = maxLength - (currentLength - length);
            if (charsToInsert > 0) {
                super.replace(fb, offset, length, filteredText.substring(0, charsToInsert), attrs);
            }
        }
    }
}

Passo 2: Modifique o construtor TelaCadatroFuncionario() para usar o NumberOnlyDocumentFilter nos campos apropriados.

Você aplicará o NumberOnlyDocumentFilter para txtIDFunc, txtTelefoneFunc, txtSalarioFunc. Para os campos de texto (Nome, Cargo, Endereço, Observações, Email), você continuará usando o LengthRestrictedDocumentFilter que permite espaços, e confiará no .trim() ao obter o valor.

Java
import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.UIManager;
import javax.swing.text.AbstractDocument;
import javax.swing.text.DocumentFilter; // Importe DocumentFilter

public class TelaCadatroFuncionario extends javax.swing.JFrame {
    // ... (suas variáveis de instância existentes)

    public TelaCadatroFuncionario() {
        initComponents();
        setLocationRelativeTo(null);
        bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]{
            "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });

        // --- APLICANDO LIMITES DE CARACTERES E FILTROS ESPECÍFICOS ---

        // ID: Apenas números, sem espaços
        ((AbstractDocument) txtIDFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(9));

        // Nome Completo: Permite espaços (serão ignorados no trim() ao obter), com limite de caracteres
        ((AbstractDocument) txtNomeCompletoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(60));

        // Número de Bilhete: Apenas números (para o formato padrão, como o de Angola sem letras)
        // Se o formato angolano (999999999AA999) precisar de letras e números, o NumberOnlyDocumentFilter não servirá.
        // Neste caso, você precisaria de um DocumentFilter mais complexo que aceitasse dígitos e letras 'A'.
        // Por enquanto, vou assumir que você quer apenas dígitos se for para validação numérica pura.
        // Se precisar do formato 999999999AA999, me avise para criarmos um DocumentFilter mais específico para o Bilhete.
        ((AbstractDocument) txtNumeroBilheteFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(14)); // Assumindo apenas números aqui

        // Data de Nascimento: Permite dígitos e barras (se for o caso de um campo formatado)
        // Se você quiser que o DocumentFilter já force o formato dd/MM/yyyy, precisaremos de um DateDocumentFilter.
        // Por ora, mantém o LengthRestrictedDocumentFilter para 10 caracteres.
        ((AbstractDocument) txtDataNascimentoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));

        // Telefone: Apenas números, sem espaços
        ((AbstractDocument) txtTelefoneFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(15));

        // Email: Permite caracteres de email (letras, números, @, ., -, _)
        // A validação de formato de email mais complexa é feita depois. Aqui é só o comprimento.
        ((AbstractDocument) txtEmailFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100));

        // Cargo/Função: Permite espaços, com limite
        ((AbstractDocument) txtCargoFuncaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(50));

        // Data Contratação: Permite dígitos e barras
        // Semelhante à Data de Nascimento.
        ((AbstractDocument) txtDataContratacaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));

        // Salário: Apenas números (para inteiros ou o que for digitado), sem espaços
        // Se precisar de casas decimais (e.g., 123.45 ou 123,45), você precisará de um DecimalNumberDocumentFilter.
        // Para este caso, vou assumir que você quer apenas dígitos ou que a formatação será feita na entrada do valor.
        ((AbstractDocument) txtSalarioFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(15));

        // Endereço: Permite espaços, com limite
        ((AbstractDocument) txtEnderecoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(200));

        // Observações (JTextArea): Permite espaços, com limite
        ((AbstractDocument) txtObservacoes.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(500));
        // --- FIM DA APLICAÇÃO DOS DocumentFilters ---
    }
    // ... (restante do seu código)
}

Passo 3: Mantenha o .trim() ao obter os valores dos campos de texto (Strings).

Para os campos como nomeCompleto, email, cargoFuncao, endereco, observacoes, o trim() é essencial para remover espaços em branco do início e do final da string, conforme você solicitou.

Exemplo em bnAdicionarActionPerformed:

Java
private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
    // Obtenção dos valores dos campos
    String idFuncStr = txtIDFunc.getText().trim(); // Já filtrado, mas trim para garantia
    String nomeCompleto = txtNomeCompletoFunc.getText().trim(); // Trim para remover espaços indesejados
    String numeroBilhete = txtNumeroBilheteFunc.getText().trim(); // Já filtrado, mas trim para garantia
    String dataNascimentoStr = txtDataNascimentoFunc.getText().trim();
    String telefoneStr = txtTelefoneFunc.getText().trim(); // Já filtrado, mas trim para garantia
    String email = txtEmailFunc.getText().trim();
    String cargoFuncao = txtCargoFuncaoFunc.getText().trim();
    String dataContratacaoStr = txtDataContratacaoFunc.getText().trim();
    String salarioStr = txtSalarioFunc.getText().trim(); // Já filtrado, mas trim para garantia
    String endereco = txtEnderecoFunc.getText().trim();
    String observacoes = txtObservacoes.getText().trim();

    String sexo = "";
    if (rbMasculino.isSelected()) {
        sexo = "Masculino";
    } else if (rbFeminino.isSelected()) {
        sexo = "Feminino";
    } else if (jRadioButton3.isSelected()) { // Corrigido para jRadioButton3
        sexo = "Outros";
    }

    // Validações
    if (idFuncStr.isEmpty() || nomeCompleto.isEmpty() || numeroBilhete.isEmpty() ||
        dataNascimentoStr.isEmpty() || telefoneStr.isEmpty() || email.isEmpty() ||
        cargoFuncao.isEmpty() || dataContratacaoStr.isEmpty() || salarioStr.isEmpty() ||
        endereco.isEmpty() || sexo.isEmpty()) {
        JOptionPane.showMessageDialog(this, "Por favor, preencha todos os campos obrigatórios.", "Campos Vazios", JOptionPane.WARNING_MESSAGE);
        return;
    }

    // Validação de formato para ID (agora que o filtro já garante números)
    if (!idFuncStr.matches("\\d+")) { // Verifica se contém APENAS dígitos (redundante com o filtro, mas bom para checagem final)
        JOptionPane.showMessageDialog(this, "ID deve conter apenas números.", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
        return;
    }
    int idFunc = Integer.parseInt(idFuncStr);

    // Validação de formato para Telefone (agora que o filtro já garante números)
    if (!telefoneStr.matches("\\d+")) { // Verifica se contém APENAS dígitos (redundante com o filtro, mas bom para checagem final)
        JOptionPane.showMessageDialog(this, "Telefone deve conter apenas números.", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
        return;
    }

    // Validação de formato para Salário (agora que o filtro já garante números)
    if (!salarioStr.matches("\\d+(\\.\\d+)?")) { // Permite números inteiros ou decimais (com ponto)
        JOptionPane.showMessageDialog(this, "Salário deve ser um valor numérico válido (ex: 1500 ou 1500.50).", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
        return;
    }
    double salario = Double.parseDouble(salarioStr);

    // Validação de Email
    String emailRegex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
    Pattern emailPattern = Pattern.compile(emailRegex);
    Matcher emailMatcher = emailPattern.matcher(email);
    if (!emailMatcher.matches()) {
        JOptionPane.showMessageDialog(this, "Por favor, insira um endereço de email válido.", "Erro de Email", JOptionPane.ERROR_MESSAGE);
        return;
    }

    // Validação de Data de Nascimento e Contratação
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    dateFormat.setLenient(false); // Impede que datas inválidas sejam interpretadas (ex: 31/02)
    Date dataNascimento = null;
    Date dataContratacao = null;

    try {
        dataNascimento = dateFormat.parse(dataNascimentoStr);
    } catch (ParseException ex) {
        JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use dd/MM/yyyy.", "Erro de Data", JOptionPane.ERROR_MESSAGE);
        Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(Level.SEVERE, null, ex);
        return;
    }

    try {
        dataContratacao = dateFormat.parse(dataContratacaoStr);
    } catch (ParseException ex) {
        JOptionPane.showMessageDialog(this, "Formato de Data de Contratação inválido. Use dd/MM/yyyy.", "Erro de Data", JOptionPane.ERROR_MESSAGE);
        Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(Level.SEVERE, null, ex);
        return;
    }

    // Adicionar os dados à tabela
    DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
    model.addRow(new Object[]{
        idFunc, nomeCompleto, numeroBilhete, cargoFuncao, telefoneStr, email, salario, dataContratacaoStr
    });

    // Limpar campos
    txtIDFunc.setText("");
    txtNomeCompletoFunc.setText("");
    txtNumeroBilheteFunc.setText("");
    txtDataNascimentoFunc.setText("");
    txtTelefoneFunc.setText("");
    txtEmailFunc.setText("");
    txtCargoFuncaoFunc.setText("");
    txtDataContratacaoFunc.setText("");
    txtSalarioFunc.setText("");
    txtEnderecoFunc.setText("");
    txtObservacoes.setText("");
    buttonGroupSexo.clearSelection();
    txtIDFunc.requestFocus(); // Coloca o foco no primeiro campo
}

Explicação das Mudanças:

  1. NumberOnlyDocumentFilter:

    • Este novo DocumentFilter é específico para campos que devem aceitar apenas números.
    • Ele usa string.replaceAll("[^0-9]", "") para remover qualquer caractere que não seja um dígito (0-9) antes de tentar inserir ou substituir o texto. Isso garante que espaços ou letras não sejam digitados nesses campos.
    • Mantém a lógica de maxLength do seu LengthRestrictedDocumentFilter.
  2. Aplicação no Construtor:

    • txtIDFunc, txtTelefoneFunc, txtSalarioFunc agora usam NumberOnlyDocumentFilter.
    • Os demais campos de texto (txtNomeCompletoFunc, txtEmailFunc, etc.) continuam usando LengthRestrictedDocumentFilter para permitir espaços, pois o trim() cuidará deles ao obter o valor.
    • Observação sobre Bilhete de Identidade: O formato angolano pode incluir letras (e.g., "AA"). Se txtNumeroBilheteFunc precisar aceitar letras e números, o NumberOnlyDocumentFilter não é o ideal. Você precisaria de um DocumentFilter mais genérico (como o LengthRestrictedDocumentFilter) e fazer a validação de formato (matches) no bnAdicionarActionPerformed usando uma expressão regular mais complexa, tipo "[0-9]{9}[A-Z]{2}[0-9]{3}". Eu ajustei para NumberOnlyDocumentFilter por enquanto, mas fique atento a isso.
  3. Manutenção do .trim():

    • O .trim() continua sendo usado em todos os getText() ao obter os valores dos campos. Isso é crucial para remover quaisquer espaços em branco do início e do final das strings, conforme você solicitou para os campos de texto. Para os campos numéricos, embora o filtro já remova espaços na entrada, o trim() não fará mal e é uma boa prática defensiva.

Com essas alterações, seus campos numéricos não aceitarão espaços ou outros caracteres, e seus campos de texto continuarão permitindo espaços internos, mas removerão os espaços externos ao serem processados.

Perfeito! Você me forneceu a implementação da sua classe LengthRestrictedDocumentFilter.

Esta classe está correta e bem implementada para a sua finalidade de restringir o número máximo de caracteres em campos de texto. Ela funciona exatamente como deveria:

  • insertString: Impede que o usuário digite mais caracteres do que o maxLength permitido.
  • replace: Impede que uma operação de colar ou substituição insira mais caracteres do que o maxLength.
  • remove: Permite a remoção de caracteres sem restrição (o que é o comportamento esperado, pois remover não aumenta o comprimento).

Com esta classe e a nova NumberOnlyDocumentFilter que te sugeri, você tem as ferramentas para controlar a entrada de dados nos seus JTextField e JTextArea de forma robusta e específica para cada tipo de campo (apenas números vs. texto com espaços permitidos).

Se precisar de mais alguma validação ou filtro, é só avisar!

implemente aqui

Para implementar as funcionalidades de filtragem e validação, você precisará adicionar a classe NumberOnlyDocumentFilter ao seu projeto e fazer as modificações na classe TelaCadatroFuncionario conforme explicado anteriormente.

Vou fornecer o código completo da classe TelaCadatroFuncionario com as modificações aplicadas e também a classe NumberOnlyDocumentFilter.


1. Crie um novo arquivo chamado NumberOnlyDocumentFilter.java (se ainda não o fez) e adicione o seguinte código:

Java
package telas; // Certifique-se de que está no mesmo pacote da TelaCadatroFuncionario

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class NumberOnlyDocumentFilter extends DocumentFilter {
    private int maxLength;

    public NumberOnlyDocumentFilter(int maxLength) {
        this.maxLength = maxLength;
    }

    @Override
    public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
        if (string == null) {
            return;
        }

        // Remove quaisquer caracteres que não sejam dígitos
        String filteredString = string.replaceAll("[^0-9]", "");

        // Calcula o tamanho da string resultante após a inserção
        int currentLength = fb.getDocument().getLength();
        int newLength = currentLength + filteredString.length();

        if (newLength <= maxLength) {
            super.insertString(fb, offset, filteredString, attr);
        } else {
            // Se exceder o comprimento máximo, insere apenas o que couber
            int charsToInsert = maxLength - currentLength;
            if (charsToInsert > 0) {
                super.insertString(fb, offset, filteredString.substring(0, charsToInsert), attr);
            }
        }
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        if (text == null) {
            super.replace(fb, offset, length, text, attrs);
            return;
        }

        // Remove quaisquer caracteres que não sejam dígitos
        String filteredText = text.replaceAll("[^0-9]", "");

        // Calcula o tamanho da string resultante após a substituição
        int currentLength = fb.getDocument().getLength();
        int newLength = currentLength - length + filteredText.length();

        if (newLength <= maxLength) {
            super.replace(fb, offset, length, filteredText, attrs);
        } else {
            // Se exceder o comprimento máximo, insere apenas o que couber
            int charsToInsert = maxLength - (currentLength - length);
            if (charsToInsert > 0) {
                super.replace(fb, offset, length, filteredText.substring(0, charsToInsert), attrs);
            }
        }
    }
}

2. Substitua o conteúdo completo da sua classe TelaCadatroFuncionario.java pelo seguinte código atualizado:

(Observe que mantive a estrutura do seu código, adicionando os DocumentFilters no construtor e ajustando o método bnAdicionarActionPerformed com as validações e .trim().)

Java
package telas;

import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.UIManager;
import javax.swing.text.AbstractDocument;
import javax.swing.text.DocumentFilter; // Certifique-se de ter esta importação

public class TelaCadatroFuncionario extends javax.swing.JFrame {
    //private javax.swing.JRadioButton rbFeminino;
    //private javax.swing.JRadioButton rbMasculino;

    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName());
    private int maxLength; // Esta variável não é mais estritamente necessária aqui, pois o LengthRestrictedDocumentFilter já a encapsula

    public TelaCadatroFuncionario() {
        initComponents();
        setLocationRelativeTo(null);
        bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]{
            "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });

        // --- APLICANDO LIMITES DE CARACTERES COM DocumentFilter ---
        // ID: Apenas números, sem espaços
        ((AbstractDocument) txtIDFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(9));

        // Nome Completo: Permite espaços (serão ignorados no trim() ao obter), com limite de caracteres
        ((AbstractDocument) txtNomeCompletoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(60));

        // Número de Bilhete: Apenas números. Se precisar de letras (ex: para o formato Angolano "999999999AA999"),
        // você precisará de um DocumentFilter personalizado que aceite dígitos E letras para esse campo específico,
        // ou ajustar a validação no bnAdicionarActionPerformed.
        // Por ora, mantém como NumberOnlyDocumentFilter para garantir apenas dígitos na entrada.
        ((AbstractDocument) txtNumeroBilheteFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(14));

        // Data de Nascimento: 10 caracteres (dd/MM/yyyy). Permite todos os caracteres, validação de formato ocorre no actionPerformed.
        ((AbstractDocument) txtDataNascimentoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));

        // Telefone: Apenas números, sem espaços
        ((AbstractDocument) txtTelefoneFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(15));

        // Email: Permite caracteres de email (letras, números, @, ., -, _), validação de formato ocorre no actionPerformed.
        ((AbstractDocument) txtEmailFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100));

        // Cargo/Função: Permite espaços, com limite
        ((AbstractDocument) txtCargoFuncaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(50));

        // Data Contratação: 10 caracteres (dd/MM/yyyy). Permite todos os caracteres, validação de formato ocorre no actionPerformed.
        ((AbstractDocument) txtDataContratacaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));

        // Salário: Apenas números. Se precisar de casas decimais (com ponto ou vírgula),
        // você precisará de um DocumentFilter que aceite dígitos e um separador decimal.
        // Por ora, mantém como NumberOnlyDocumentFilter para garantir apenas dígitos na entrada.
        ((AbstractDocument) txtSalarioFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(15));

        // Endereço: Permite espaços, com limite
        ((AbstractDocument) txtEnderecoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(200));

        // Observações (JTextArea): Permite espaços, com limite
        ((AbstractDocument) txtObservacoes.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(500));
        // --- FIM DA APLICAÇÃO DOS DocumentFilters ---
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        buttonGroupSexo = new javax.swing.ButtonGroup();
        jScrollPane1 = new javax.swing.JScrollPane();
        painelPrincipalFuncionarios = new javax.swing.JPanel();
        jScrollPaneTabelaFuncionarios = new javax.swing.JScrollPane();
        jTableFuncionarios = new javax.swing.JTable();
        LOGO = new javax.swing.JLabel();
        tITULO = new javax.swing.JLabel();
        lblNomeCompleto = new javax.swing.JLabel();
        lblID = new javax.swing.JLabel();
        lblNumeroBilhete = new javax.swing.JLabel();
        lblDataNascimento = new javax.swing.JLabel();
        lblTelefone = new javax.swing.JLabel();
        lblEmail = new javax.swing.JLabel();
        lblCargoFuncao = new javax.swing.JLabel();
        lblDataContratacao = new javax.swing.JLabel();
        lblSalario = new javax.swing.JLabel();
        lblEndereco = new javax.swing.JLabel();
        lblSexo = new javax.swing.JLabel();
        bnAdicionar = new javax.swing.JButton();
        bnAtualizar = new javax.swing.JButton();
        bnExcluir = new javax.swing.JButton();
        txtIDFunc = new javax.swing.JTextField();
        txtNomeCompletoFunc = new javax.swing.JTextField();
        txtNumeroBilheteFunc = new javax.swing.JTextField();
        txtDataNascimentoFunc = new javax.swing.JTextField();
        txtTelefoneFunc = new javax.swing.JTextField();
        txtEmailFunc = new javax.swing.JTextField();
        txtCargoFuncaoFunc = new javax.swing.JTextField();
        txtDataContratacaoFunc = new javax.swing.JTextField();
        txtSalarioFunc = new javax.swing.JTextField();
        txtEnderecoFunc = new javax.swing.JTextField();
        jScrollPaneObservacoesFunc = new javax.swing.JPanel();
        painelObservacoesFunc = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        btnLimparID = new javax.swing.JButton();
        btnLimparNome = new javax.swing.JButton();
        btnLimparBilhete = new javax.swing.JButton();
        btnLimparNascimento = new javax.swing.JButton();
        btnLimparTelefone = new javax.swing.JButton();
        btnLimparEmail = new javax.swing.JButton();
        btnLimparCargoFuncao = new javax.swing.JButton();
        btnLimparDataContracao = new javax.swing.JButton();
        btnLimparSalario = new javax.swing.JButton();
        btnLimparEndereco = new javax.swing.JButton();
        bnVoltar = new javax.swing.JButton();
        lblObservacoes = new javax.swing.JLabel();
        rbMasculino = new javax.swing.JRadioButton();
        rbFeminino = new javax.swing.JRadioButton();
        jRadioButton3 = new javax.swing.JRadioButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jScrollPaneTabelaFuncionarios.setPreferredSize(new java.awt.Dimension(850, 250));

        jTableFuncionarios.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null}
            },
            new String [] {
                "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Object.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class, java.lang.Integer.class, java.lang.String.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        jScrollPaneTabelaFuncionarios.setViewportView(jTableFuncionarios);

        LOGO.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagem/logo1-removebg-preview.png"))); // NOI18N

        tITULO.setFont(new java.awt.Font("Liberation Sans", 1, 24)); // NOI18N
        tITULO.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        tITULO.setText("Gestão de Funcionários");

        lblNomeCompleto.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNomeCompleto.setText("Nome Completo");

        lblID.setFont(new java.awt.Font("Liberation Sans", 0, 18)); // NOI18N
        lblID.setText("Id");

        lblNumeroBilhete.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblNumeroBilhete.setText("Nº de Bilhete");

        lblDataNascimento.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataNascimento.setText("Data Nasc.:");

        lblTelefone.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblTelefone.setText("Telefone");

        lblEmail.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEmail.setText("Email");

        lblCargoFuncao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblCargoFuncao.setText("Cargo/Função");

        lblDataContratacao.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblDataContratacao.setText("Data Contratação");

        lblSalario.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSalario.setText("Salário");

        lblEndereco.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblEndereco.setText("Endereço");

        lblSexo.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblSexo.setText("Sexo");

        bnAdicionar.setText("Adicionar");
        bnAdicionar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAdicionarActionPerformed(evt);
            }
        });

        bnAtualizar.setText("Atualizar");
        bnAtualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnAtualizarActionPerformed(evt);
            }
        });

        bnExcluir.setText("Excluir");
        bnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnExcluirActionPerformed(evt);
            }
        });

        txtIDFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtIDFuncActionPerformed(evt);
            }
        });

        txtNomeCompletoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNomeCompletoFuncActionPerformed(evt);
            }
        });

        txtDataNascimentoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataNascimentoFuncActionPerformed(evt);
            }
        });

        txtTelefoneFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtTelefoneFuncActionPerformed(evt);
            }
        });

        txtEmailFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtEmailFuncActionPerformed(evt);
            }
        });

        txtCargoFuncaoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtCargoFuncaoFuncActionPerformed(evt);
            }
        });

        txtDataContratacaoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtDataContratacaoFuncActionPerformed(evt);
            }
        });

        txtSalarioFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtSalarioFuncActionPerformed(evt);
            }
        });

        txtEnderecoFunc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtEnderecoFuncActionPerformed(evt);
            }
        });

        txtObservacoes.setColumns(20);
        txtObservacoes.setRows(5);
        painelObservacoesFunc.setViewportView(txtObservacoes);

        javax.swing.GroupLayout jScrollPaneObservacoesFuncLayout = new javax.swing.GroupLayout(jScrollPaneObservacoesFunc);
        jScrollPaneObservacoesFunc.setLayout(jScrollPaneObservacoesFuncLayout);
        jScrollPaneObservacoesFuncLayout.setHorizontalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jScrollPaneObservacoesFuncLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(17, 17, 17))
        );
        jScrollPaneObservacoesFuncLayout.setVerticalGroup(
            jScrollPaneObservacoesFuncLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(painelObservacoesFunc, javax.swing.GroupLayout.Alignment.TRAILING)
        );

        btnLimparID.setText("Limpar");
        btnLimparID.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparIDActionPerformed(evt);
            }
        });

        btnLimparNome.setText("Limpar");
        btnLimparNome.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNomeActionPerformed(evt);
            }
        });

        btnLimparBilhete.setText("Limpar");
        btnLimparBilhete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparBilheteActionPerformed(evt);
            }
        });

        btnLimparNascimento.setText("Limpar");
        btnLimparNascimento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparNascimentoActionPerformed(evt);
            }
        });

        btnLimparTelefone.setText("Limpar");
        btnLimparTelefone.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparTelefoneActionPerformed(evt);
            }
        });

        btnLimparEmail.setText("Limpar");
        btnLimparEmail.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEmailActionPerformed(evt);
            }
        });

        btnLimparCargoFuncao.setText("Limpar");
        btnLimparCargoFuncao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparCargoFuncaoActionPerformed(evt);
            }
        });

        btnLimparDataContracao.setText("Limpar");
        btnLimparDataContracao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparDataContracaoActionPerformed(evt);
            }
        });

        btnLimparSalario.setText("Limpar");
        btnLimparSalario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparSalarioActionPerformed(evt);
            }
        });

        btnLimparEndereco.setText("Limpar");
        btnLimparEndereco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnLimparEnderecoActionPerformed(evt);
            }
        });

        bnVoltar.setText("Voltar");
        bnVoltar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bnVoltarActionPerformed(evt);
            }
        });

        lblObservacoes.setFont(new java.awt.Font("Liberation Sans", 1, 15)); // NOI18N
        lblObservacoes.setText("Observações");

        rbMasculino.setBackground(new java.awt.Color(153, 153, 153));
        buttonGroupSexo.add(rbMasculino);
        rbMasculino.setText("Masculino");

        rbFeminino.setBackground(new java.awt.Color(153, 153, 153));
        buttonGroupSexo.add(rbFeminino);
        rbFeminino.setText("Feminino");
        rbFeminino.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbFemininoActionPerformed(evt);
            }
        });

        jRadioButton3.setBackground(new java.awt.Color(153, 153, 153));
        buttonGroupSexo.add(jRadioButton3);
        jRadioButton3.setText("outros");

        javax.swing.GroupLayout painelPrincipalFuncionariosLayout = new javax.swing.GroupLayout(painelPrincipalFuncionarios);
        painelPrincipalFuncionarios.setLayout(painelPrincipalFuncionariosLayout);
        painelPrincipalFuncionariosLayout.setHorizontalGroup(
            painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGap(356, 356, 356)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblDataContratacao)
                    .addComponent(lblSalario)
                    .addComponent(lblCargoFuncao)
                    .addComponent(lblEmail)
                    .addComponent(lblTelefone)
                    .addComponent(lblDataNascimento)
                    .addComponent(lblNumeroBilhete)
                    .addComponent(lblNomeCompleto)
                    .addComponent(lblID, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblEndereco)
                    .addComponent(lblSexo, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(34, 34, 34)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(rbFeminino)
                        .addGap(46, 46, 46)
                        .addComponent(rbMasculino)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jRadioButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(txtSalarioFunc, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
                            .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtEmailFunc, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 242, Short.MAX_VALUE)
                            .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtIDFunc, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtDataContratacaoFunc, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.Alignment.LEADING))
                        .addGap(47, 47, 47)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(btnLimparID, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnLimparNome, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnLimparBilhete, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnLimparNascimento, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnLimparTelefone, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnLimparEmail, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnLimparCargoFuncao, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnLimparDataContracao, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnLimparSalario, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnLimparEndereco, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(lblObservacoes)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(jScrollPaneTabelaFuncionarios, javax.swing.GroupLayout.PREFERRED_SIZE, 1123, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(16, 16, 16))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addComponent(bnAtualizar)
                        .addGap(137, 137, 137)
                        .addComponent(bnAdicionar)
                        .addGap(323, 323, 323))))
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(373, 373, 373)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 353, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(tITULO, javax.swing.GroupLayout.PREFERRED_SIZE, 460, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(876, 876, 876)
                        .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(227, Short.MAX_VALUE))
        );
        painelPrincipalFuncionariosLayout.setVerticalGroup(
            painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(47, 47, 47)
                        .addComponent(LOGO, javax.swing.GroupLayout.PREFERRED_SIZE, 233, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGap(83, 83, 83)
                        .addComponent(bnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tITULO)
                .addGap(32, 32, 32)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelPrincipalFuncionariosLayout.createSequentialGroup()
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnLimparID)
                            .addComponent(txtIDFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblID))
                        .addGap(37, 37, 37)
                        .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtNomeCompletoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblNomeCompleto)))
                    .addComponent(btnLimparNome, javax.swing.GroupLayout.Alignment.TRAILING))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblNumeroBilhete)
                    .addComponent(txtNumeroBilheteFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparBilhete))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblDataNascimento)
                    .addComponent(txtDataNascimentoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparNascimento))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblTelefone)
                    .addComponent(txtTelefoneFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparTelefone))
                .addGap(26, 26, 26)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblEmail)
                    .addComponent(txtEmailFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparEmail))
                .addGap(28, 28, 28)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblCargoFuncao)
                    .addComponent(txtCargoFuncaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparCargoFuncao))
                .addGap(30, 30, 30)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtDataContratacaoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnLimparDataContracao)
                    .addComponent(lblDataContratacao))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblSalario)
                    .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtSalarioFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btnLimparSalario)))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblEndereco)
                    .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtEnderecoFunc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btnLimparEndereco)))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblSexo)
                    .addComponent(rbFeminino)
                    .addComponent(rbMasculino)
                    .addComponent(jRadioButton3))
                .addGap(18, 18, 18)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblObservacoes)
                    .addComponent(jScrollPaneObservacoesFunc, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(34, 34, 34)
                .addGroup(painelPrincipalFuncionariosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bnAdicionar, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnAtualizar, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bnExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(jScrollPaneTabelaFuncionarios, javax.swing.GroupLayout.PREFERRED_SIZE, 246, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(15, 15, 15))
        );

        jScrollPane1.setViewportView(painelPrincipalFuncionarios);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 1163, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1025, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
        // Obtenção dos valores dos campos
        String idFuncStr = txtIDFunc.getText().trim();
        String nomeCompleto = txtNomeCompletoFunc.getText().trim();
        String numeroBilhete = txtNumeroBilheteFunc.getText().trim();
        String dataNascimentoStr = txtDataNascimentoFunc.getText().trim();
        String telefoneStr = txtTelefoneFunc.getText().trim();
        String email = txtEmailFunc.getText().trim();
        String cargoFuncao = txtCargoFuncaoFunc.getText().trim();
        String dataContratacaoStr = txtDataContratacaoFunc.getText().trim();
        String salarioStr = txtSalarioFunc.getText().trim();
        String endereco = txtEnderecoFunc.getText().trim();
        String observacoes = txtObservacoes.getText().trim();

        String sexo = "";
        if (rbMasculino.isSelected()) {
            sexo = "Masculino";
        } else if (rbFeminino.isSelected()) {
            sexo = "Feminino";
        } else if (jRadioButton3.isSelected()) {
            sexo = "Outros";
        }

        // Validações de campos vazios
        if (idFuncStr.isEmpty() || nomeCompleto.isEmpty() || numeroBilhete.isEmpty() ||
            dataNascimentoStr.isEmpty() || telefoneStr.isEmpty() || email.isEmpty() ||
            cargoFuncao.isEmpty() || dataContratacaoStr.isEmpty() || salarioStr.isEmpty() ||
            endereco.isEmpty() || sexo.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Por favor, preencha todos os campos obrigatórios.", "Campos Vazios", JOptionPane.WARNING_MESSAGE);
            return;
        }

        // --- Validações de Formato Adicionais ---
        // Validação de ID (agora que o filtro já garante números, mas bom para checagem final)
        try {
            int idFunc = Integer.parseInt(idFuncStr);
            if (idFunc <= 0) { // Exemplo: ID deve ser positivo
                JOptionPane.showMessageDialog(this, "ID deve ser um número positivo.", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "ID deve conter apenas números válidos.", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
            return;
        }

        // Validação de formato para NumeroBilhete (se precisar de formato específico como 999999999AA999)
        // Por exemplo, para um formato de BI angolano (9 dígitos, 2 letras, 3 dígitos):
        // if (!numeroBilhete.matches("\\d{9}[A-Z]{2}\\d{3}")) {
        //     JOptionPane.showMessageDialog(this, "Número de Bilhete inválido. Use o formato XXXXXXXXXAAXXX.", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
        //     return;
        // }
        // Se for apenas numérico, o NumberOnlyDocumentFilter já ajuda, mas se precisar de mais, pode adicionar a regex aqui.

        // Validação de formato para Telefone (agora que o filtro já garante números)
        // Você pode adicionar uma validação de comprimento mínimo/máximo para o telefone aqui.
        if (!telefoneStr.matches("\\d+")) { // Garante que, mesmo sem o filtro, apenas dígitos estejam aqui.
            JOptionPane.showMessageDialog(this, "Telefone deve conter apenas números.", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
            return;
        }


        // Validação de Email
        String emailRegex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
        Pattern emailPattern = Pattern.compile(emailRegex);
        Matcher emailMatcher = emailPattern.matcher(email);
        if (!emailMatcher.matches()) {
            JOptionPane.showMessageDialog(this, "Por favor, insira um endereço de email válido.", "Erro de Email", JOptionPane.ERROR_MESSAGE);
            return;
        }

        // Validação de formato para Salário (permite números inteiros ou decimais com ponto)
        double salario;
        try {
            salario = Double.parseDouble(salarioStr);
            if (salario < 0) { // Salário não pode ser negativo
                JOptionPane.showMessageDialog(this, "Salário não pode ser um valor negativo.", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Salário deve ser um valor numérico válido (ex: 1500 ou 1500.50).", "Erro de Validação", JOptionPane.ERROR_MESSAGE);
            return;
        }

        // Validação de Data de Nascimento e Contratação
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.setLenient(false); // Impede que datas inválidas sejam interpretadas (ex: 31/02)
        Date dataNascimento = null;
        Date dataContratacao = null;

        try {
            dataNascimento = dateFormat.parse(dataNascimentoStr);
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Nascimento inválido. Use dd/MM/yyyy.", "Erro de Data", JOptionPane.ERROR_MESSAGE);
            Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(Level.SEVERE, null, ex);
            return;
        }

        try {
            dataContratacao = dateFormat.parse(dataContratacaoStr);
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(this, "Formato de Data de Contratação inválido. Use dd/MM/yyyy.", "Erro de Data", JOptionPane.ERROR_MESSAGE);
            Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(Level.SEVERE, null, ex);
            return;
        }

        // Adicionar os dados à tabela
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.addRow(new Object[]{
            idFuncStr, // Mantendo como String para ID, ou parse para int se for usado como numérico na tabela
            nomeCompleto,
            numeroBilhete,
            cargoFuncao,
            telefoneStr, // Mantendo como String, ou parse para Long se for usado como numérico na tabela
            email,
            salario,
            dataContratacaoStr
        });

        // Limpar campos
        txtIDFunc.setText("");
        txtNomeCompletoFunc.setText("");
        txtNumeroBilheteFunc.setText("");
        txtDataNascimentoFunc.setText("");
        txtTelefoneFunc.setText("");
        txtEmailFunc.setText("");
        txtCargoFuncaoFunc.setText("");
        txtDataContratacaoFunc.setText("");
        txtSalarioFunc.setText("");
        txtEnderecoFunc.setText("");
        txtObservacoes.setText("");
        buttonGroupSexo.clearSelection(); // Para desmarcar os radio buttons
        txtIDFunc.requestFocus(); // Coloca o foco no primeiro campo novamente
    }

    private void bnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {
        // Implemente sua lógica de atualização aqui
    }

    private void bnExcluirActionPerformed(java.awt.event.ActionEvent evt) {
        // Implemente sua lógica de exclusão aqui
    }

    private void txtIDFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtNomeCompletoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtDataNascimentoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtTelefoneFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtEmailFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtCargoFuncaoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtDataContratacaoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtSalarioFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void txtEnderecoFuncActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void btnLimparIDActionPerformed(java.awt.event.ActionEvent evt) {
        txtIDFunc.setText("");
    }

    private void btnLimparNomeActionPerformed(java.awt.event.ActionEvent evt) {
        txtNomeCompletoFunc.setText("");
    }

    private void btnLimparBilheteActionPerformed(java.awt.event.ActionEvent evt) {
        txtNumeroBilheteFunc.setText("");
    }

    private void btnLimparNascimentoActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataNascimentoFunc.setText("");
    }

    private void btnLimparTelefoneActionPerformed(java.awt.event.ActionEvent evt) {
        txtTelefoneFunc.setText("");
    }

    private void btnLimparEmailActionPerformed(java.awt.event.ActionEvent evt) {
        txtEmailFunc.setText("");
    }

    private void btnLimparCargoFuncaoActionPerformed(java.awt.event.ActionEvent evt) {
        txtCargoFuncaoFunc.setText("");
    }

    private void btnLimparDataContracaoActionPerformed(java.awt.event.ActionEvent evt) {
        txtDataContratacaoFunc.setText("");
    }

    private void btnLimparSalarioActionPerformed(java.awt.event.ActionEvent evt) {
        txtSalarioFunc.setText("");
    }

    private void btnLimparEnderecoActionPerformed(java.awt.event.ActionEvent evt) {
        txtEnderecoFunc.setText("");
    }

    private void bnVoltarActionPerformed(java.awt.event.ActionEvent evt) {
        // Supondo que você queira voltar para a TelaPrincipal
        TelaPrincipal telaPrincipal = new TelaPrincipal();
        telaPrincipal.setVisible(true);
        this.dispose(); // Fecha a tela atual
    }

    private void rbFemininoActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                // Aplica o look and feel do sistema
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception e) {
                    logger.log(Level.WARNING, "Não foi possível aplicar o System Look and Feel", e);
                }
                new TelaCadatroFuncionario().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel LOGO;
    private javax.swing.JButton bnAdicionar;
    private javax.swing.JButton bnAtualizar;
    private javax.swing.JButton bnExcluir;
    private javax.swing.JButton bnVoltar;
    private javax.swing.JButton btnLimparBilhete;
    private javax.swing.JButton btnLimparCargoFuncao;
    private javax.swing.JButton btnLimparDataContracao;
    private javax.swing.JButton btnLimparEmail;
    private javax.swing.JButton btnLimparEndereco;
    private javax.swing.JButton btnLimparID;
    private javax.swing.JButton btnLimparNascimento;
    private javax.swing.JButton btnLimparNome;
    private javax.swing.JButton btnLimparSalario;
    private javax.swing.JButton btnLimparTelefone;
    private javax.swing.ButtonGroup buttonGroupSexo;
    private javax.swing.JRadioButton jRadioButton3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPanel jScrollPaneObservacoesFunc;
    private javax.swing.JScrollPane jScrollPaneTabelaFuncionarios;
    private javax.swing.JTable jTableFuncionarios;
    private javax.swing.JLabel lblCargoFuncao;
    private javax.swing.JLabel lblDataContratacao;
    private javax.swing.JLabel lblDataNascimento;
    private javax.swing.JLabel lblEmail;
    private javax.swing.JLabel lblEndereco;
    private javax.swing.JLabel lblID;
    private javax.swing.JLabel lblNomeCompleto;
    private javax.swing.JLabel lblNumeroBilhete;
    private javax.swing.JLabel lblObservacoes;
    private javax.swing.JLabel lblSalario;
    private javax.swing.JLabel lblSexo;
    private javax.swing.JLabel lblTelefone;
    private javax.swing.JPanel painelPrincipalFuncionarios;
    private javax.swing.JScrollPane painelObservacoesFunc;
    private javax.swing.JRadioButton rbFeminino;
    private javax.swing.JRadioButton rbMasculino;
    private javax.swing.JLabel tITULO;
    private javax.swing.JTextField txtCargoFuncaoFunc;
    private javax.swing.JTextField txtDataContratacaoFunc;
    private javax.swing.JTextField txtDataNascimentoFunc;
    private javax.swing.JTextField txtEmailFunc;
    private javax.swing.JTextField txtEnderecoFunc;
    private javax.swing.JTextField txtIDFunc;
    private javax.swing.JTextField txtNomeCompletoFunc;
    private javax.swing.JTextField txtNumeroBilheteFunc;
    private javax.swing.JTextArea txtObservacoes;
    private javax.swing.JTextField txtSalarioFunc;
    private javax.swing.JTextField txtTelefoneFunc;
    // End of variables declaration
}

Instruções para Compilação e Teste:

  1. Certifique-se de que NumberOnlyDocumentFilter.java e LengthRestrictedDocumentFilter.java estão no mesmo pacote (telas) da sua TelaCadatroFuncionario.java.
  2. Compile seu projeto.
  3. Execute a aplicação e teste os campos:
    • ID, Telefone, Salário: Tente digitar letras ou espaços. Eles não devem ser aceitos. Tente colar texto com letras ou espaços. Apenas os números devem ser inseridos.
    • Nome Completo, Cargo/Função, Endereço, Observações, Email: Tente digitar espaços no meio ou no início/fim. Os espaços devem ser aceitos na digitação, mas quando você clicar em "Adicionar", o .trim() removerá os espaços do início e do fim das strings.

Se tiver alguma dúvida sobre a validação específica do "Número de Bilhete" (se precisar de letras e números em um formato específico) ou para permitir números decimais no "Salário", me diga!

eu quero que no campo data venha / /

Perfeito! Para que os campos de data (txtDataNascimentoFunc e txtDataContratacaoFunc) exibam automaticamente as barras (/) conforme o usuário digita, você pode usar um MaskFormatter. Este é um componente Swing que ajuda a formatar e validar a entrada de texto em campos.

Vou ajustar o construtor da sua classe TelaCadatroFuncionario para incluir os MaskFormatters.


Atualize o construtor da sua TelaCadatroFuncionario.java com as seguintes modificações:

Java
package telas;

import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.UIManager;
import javax.swing.text.AbstractDocument;
import javax.swing.text.DocumentFilter;
import javax.swing.text.MaskFormatter; // Importar MaskFormatter

public class TelaCadatroFuncionario extends javax.swing.JFrame {
    // ... (restante do seu código e variáveis) ...
    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName());
    //private int maxLength; // Esta variável não é mais estritamente necessária aqui

    public TelaCadatroFuncionario() {
        initComponents();
        setLocationRelativeTo(null);
        bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]{
            "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });

        // --- APLICANDO LIMITES DE CARACTERES E MÁSCARAS COM DocumentFilter/MaskFormatter ---

        // ID: Apenas números, com limite de 9 caracteres
        ((AbstractDocument) txtIDFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(9));

        // Nome Completo: Permite espaços, com limite de 60 caracteres
        ((AbstractDocument) txtNomeCompletoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(60));

        // Número de Bilhete: Apenas números, com limite de 14 caracteres.
        // Se precisar de letras (ex: para o formato Angolano "999999999AA999"),
        // você precisará de um DocumentFilter personalizado que aceite dígitos E letras para esse campo específico,
        // ou ajustar a validação no bnAdicionarActionPerformed.
        ((AbstractDocument) txtNumeroBilheteFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(14));


        // --- CAMPO DATA DE NASCIMENTO: APLICANDO MÁSCARA dd/MM/yyyy ---
        try {
            MaskFormatter dateMask = new MaskFormatter("##/##/####");
            dateMask.setPlaceholderCharacter('_'); // Caractere para mostrar os espaços vazios
            dateMask.install(txtDataNascimentoFunc);
            // Remova o DocumentFilter se ele estiver em conflito, a máscara já controla o comprimento
            // ((AbstractDocument) txtDataNascimentoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));
        } catch (ParseException e) {
            logger.log(Level.SEVERE, "Erro ao aplicar máscara de data ao campo Data de Nascimento", e);
        }

        // Telefone: Apenas números, com limite de 15 caracteres
        ((AbstractDocument) txtTelefoneFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(15));

        // Email: Permite caracteres de email (letras, números, @, ., -, _), com limite de 100 caracteres
        ((AbstractDocument) txtEmailFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100));

        // Cargo/Função: Permite espaços, com limite de 50 caracteres
        ((AbstractDocument) txtCargoFuncaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(50));

        // --- CAMPO DATA DE CONTRATAÇÃO: APLICANDO MÁSCARA dd/MM/yyyy ---
        try {
            MaskFormatter dateMask = new MaskFormatter("##/##/####");
            dateMask.setPlaceholderCharacter('_'); // Caractere para mostrar os espaços vazios
            dateMask.install(txtDataContratacaoFunc);
            // Remova o DocumentFilter se ele estiver em conflito, a máscara já controla o comprimento
            // ((AbstractDocument) txtDataContratacaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));
        } catch (ParseException e) {
            logger.log(Level.SEVERE, "Erro ao aplicar máscara de data ao campo Data de Contratação", e);
        }

        // Salário: Apenas números, com limite de 15 caracteres.
        // Se precisar de casas decimais (com ponto ou vírgula), você precisará de um DocumentFilter que aceite dígitos e um separador decimal.
        ((AbstractDocument) txtSalarioFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(15));

        // Endereço: Permite espaços, com limite de 200 caracteres
        ((AbstractDocument) txtEnderecoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(200));

        // Observações (JTextArea): Permite espaços, com limite de 500 caracteres
        ((AbstractDocument) txtObservacoes.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(500));
        // --- FIM DA APLICAÇÃO DOS DocumentFilters e MaskFormatters ---
    }

    // ... (restante da sua classe) ...
}

Explicação das Mudanças:

  1. import javax.swing.text.MaskFormatter;: Esta linha foi adicionada para importar a classe MaskFormatter.
  2. Blocos try-catch para as datas:
    • Para txtDataNascimentoFunc e txtDataContratacaoFunc, criei instâncias de MaskFormatter com o padrão "##/##/####".
      • # representa um dígito obrigatório.
      • / são caracteres literais que serão inseridos automaticamente.
    • dateMask.setPlaceholderCharacter('_'); define o caractere que será exibido nas posições vazias da máscara (por exemplo, __/__/____).
    • dateMask.install(txtDataNascimentoFunc); (e para txtDataContratacaoFunc) aplica a máscara ao JTextField correspondente.
    • O bloco try-catch é necessário porque a criação de um MaskFormatter pode lançar uma ParseException se o padrão da máscara for inválido.
  3. Remoção de LengthRestrictedDocumentFilter para campos com MaskFormatter: Eu comentei as linhas que aplicavam LengthRestrictedDocumentFilter para os campos de data (txtDataNascimentoFunc e txtDataContratacaoFunc). O MaskFormatter já impõe o comprimento correto do campo de forma mais robusta e visual.

Agora, quando você executar sua aplicação, ao focar nos campos de data, eles já exibirão __/__/____, e as barras aparecerão automaticamente enquanto o usuário digita os números.

Lembre-se de que a validação de datas inválidas (como "31/02/2025") ainda será feita no bnAdicionarActionPerformed pelo SimpleDateFormat.setLenient(false), o que é o comportamento correto. A máscara apenas ajuda na formatação da entrada.

isso esta onde import javax.swing.text.MaskFormatter;

A classe MaskFormatter está localizada no pacote padrão do Java Swing, especificamente em:

javax.swing.text.MaskFormatter;

Essa é a linha de importação correta que você deve ter no topo do seu arquivo .java (geralmente junto com outras importações javax.swing.*).

Você já a tem na sua classe TelaCadatroFuncionario, como mostrei no código completo que te forneci. Se você compilou e executou o código, significa que a importação está funcionando corretamente.

Okay, entendi o problema! O erro está na linha 42 e se repete por algumas linhas, além de um erro no final do arquivo e na declaração do pacote.

A causa é que você provavelmente copiou e colou a linha de comentário:

Java
/ --- APLICANDO LIMITES DE CARACTERES E MÁSCARAS COM DocumentFilter/MaskFormatter ---

dentro do seu código Java. Em Java, comentários de linha única começam com // e não com / seguido de espaço. O compilador Ant (e o compilador Java subjacente) interpreta / --- como um operador de divisão, o que é um "illegal start of expression" e causa os erros subsequentes de "';' expected" e "not a statement".

O erro "unnamed class should not have package declaration" na linha 5 sugere que seu ambiente pode estar compilando o arquivo como um "single-file source code program" (recurso do Java 11+ para executar arquivos .java diretamente sem compilação explícita ou estrutura de projeto complexa), onde a declaração de pacote não é permitida. No entanto, dado que você está usando Ant e uma estrutura de projeto, isso é menos provável ser a raiz do problema e mais provável ser um efeito colateral dos outros erros de sintaxe ou de como o Ant está chamando o compilador.

O erro na linha 1083 (error: class, interface, enum, or record expected }) é porque os erros de sintaxe anteriores podem ter bagunçado a interpretação da estrutura da classe, fazendo com que o compilador não reconheça o fechamento da chave da classe.

Solução:

Você precisa corrigir os comentários para o formato correto em Java (//).

Abra o arquivo /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java e localize as linhas de comentário. Mude-as para:

Java
// --- APLICANDO LIMITES DE CARACTERES E MÁSCARAS COM DocumentFilter/MaskFormatter ---
// ID: Apenas números, com limite de 9 caracteres

// Nome Completo: Permite espaços, com limite de 60 caracteres

// Número de Bilhete: Apenas números, com limite de 14 caracteres.
// Se precisar de letras (ex: para o formato Angolano "999999999AA999"),
// você precisará de um DocumentFilter personalizado que aceite dígitos E letras para esse campo específico,
// ou ajustar a validação no bnAdicionarActionPerformed.
((AbstractDocument) txtNumeroBilheteFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(14));


// --- CAMPO DATA DE NASCIMENTO: APLICANDO MÁSCARA dd/MM/yyyy ---
// ... (e assim por diante para todos os comentários que usam apenas '/')

Passos para corrigir:

  1. Edite TelaCadatroFuncionario.java:
    • Vá para a linha 42.
    • Mude / para // no início de cada linha de comentário que está causando o erro. Certifique-se de que todos os comentários que eu adicionei no código anterior (e que você provavelmente copiou) estão com // no início.
  2. Verifique a estrutura do arquivo: Garanta que há apenas uma declaração de pacote package telas; no topo e que a classe TelaCadatroFuncionario está corretamente aberta e fechada com chaves {}.
  3. Compile novamente: Execute o comando Ant novamente: ant -f /home/mcdebug/SGH/SistemaGestaoHoteleiro -Dnb.internal.action.name=rebuild clean jar

Depois de corrigir os comentários, o compilador deve conseguir entender a estrutura do seu código e compilar sem problemas.

Perfeito! Você quer ver o bloco completo de código com os comentários corrigidos e a aplicação dos DocumentFilters e MaskFormatters.

Aqui está a seção do construtor da classe TelaCadatroFuncionario com os comentários devidamente formatados (//):

Java
package telas;

import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.UIManager;
import javax.swing.text.AbstractDocument;
import javax.swing.text.DocumentFilter;
import javax.swing.text.MaskFormatter; // Importar MaskFormatter

public class TelaCadatroFuncionario extends javax.swing.JFrame {
    // ... (restante do seu código e variáveis) ...
    private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TelaCadatroFuncionario.class.getName());
    //private int maxLength; // Esta variável não é mais estritamente necessária aqui

    public TelaCadatroFuncionario() {
        initComponents();
        setLocationRelativeTo(null);
        bnVoltar.addActionListener(e -> bnVoltarActionPerformed(e));
        DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
        model.setColumnIdentifiers(new Object[]{
            "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
        });

        // --- APLICANDO LIMITES DE CARACTERES E MÁSCARAS COM DocumentFilter/MaskFormatter ---
        // ID: Apenas números, com limite de 9 caracteres
        ((AbstractDocument) txtIDFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(9));

        // Nome Completo: Permite espaços, com limite de 60 caracteres
        ((AbstractDocument) txtNomeCompletoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(60));

        // Número de Bilhete: Apenas números, com limite de 14 caracteres.
        // Se precisar de letras (ex: para o formato Angolano "999999999AA999"),
        // você precisará de um DocumentFilter personalizado que aceite dígitos E letras para esse campo específico,
        // ou ajustar a validação no bnAdicionarActionPerformed.
        ((AbstractDocument) txtNumeroBilheteFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(14));


        // --- CAMPO DATA DE NASCIMENTO: APLICANDO MÁSCARA dd/MM/yyyy ---
        try {
            MaskFormatter dateMaskNascimento = new MaskFormatter("##/##/####");
            dateMaskNascimento.setPlaceholderCharacter('_'); // Caractere para mostrar os espaços vazios
            dateMaskNascimento.install(txtDataNascimentoFunc);
            // Remova o DocumentFilter se ele estiver em conflito, a máscara já controla o comprimento
            // ((AbstractDocument) txtDataNascimentoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));
        } catch (ParseException e) {
            logger.log(Level.SEVERE, "Erro ao aplicar máscara de data ao campo Data de Nascimento", e);
        }

        // Telefone: Apenas números, com limite de 15 caracteres
        ((AbstractDocument) txtTelefoneFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(15));

        // Email: Permite caracteres de email (letras, números, @, ., -, _), com limite de 100 caracteres
        ((AbstractDocument) txtEmailFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(100));

        // Cargo/Função: Permite espaços, com limite de 50 caracteres
        ((AbstractDocument) txtCargoFuncaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(50));

        // --- CAMPO DATA DE CONTRATAÇÃO: APLICANDO MÁSCARA dd/MM/yyyy ---
        try {
            MaskFormatter dateMaskContratacao = new MaskFormatter("##/##/####");
            dateMaskContratacao.setPlaceholderCharacter('_'); // Caractere para mostrar os espaços vazios
            dateMaskContratacao.install(txtDataContratacaoFunc);
            // Remova o DocumentFilter se ele estiver em conflito, a máscara já controla o comprimento
            // ((AbstractDocument) txtDataContratacaoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(10));
        } catch (ParseException e) {
            logger.log(Level.SEVERE, "Erro ao aplicar máscara de data ao campo Data de Contratação", e);
        }

        // Salário: Apenas números, com limite de 15 caracteres.
        // Se precisar de casas decimais (com ponto ou vírgula), você precisará de um DocumentFilter que aceite dígitos e um separador decimal.
        ((AbstractDocument) txtSalarioFunc.getDocument()).setDocumentFilter(new NumberOnlyDocumentFilter(15));

        // Endereço: Permite espaços, com limite de 200 caracteres
        ((AbstractDocument) txtEnderecoFunc.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(200));

        // Observações (JTextArea): Permite espaços, com limite de 500 caracteres
        ((AbstractDocument) txtObservacoes.getDocument()).setDocumentFilter(new LengthRestrictedDocumentFilter(500));
        // --- FIM DA APLICAÇÃO DOS DocumentFilters e MaskFormatters ---
    }
    // ... (restante da sua classe) ...

Observações:

  • Eu alterei os nomes das variáveis dateMask para dateMaskNascimento e dateMaskContratacao nos blocos try-catch para evitar a re-declaração da mesma variável e deixar o código mais claro, embora em escopos diferentes (dentro de blocos try) não causaria um erro. É uma boa prática.
  • Os comentários agora estão todos com // no início, o que o compilador Java entenderá corretamente.
  • A aplicação dos DocumentFilters e MaskFormatters está sendo feita no construtor da sua TelaCadatroFuncionario, logo após initComponents().

Agora, se você substituir esta seção no seu arquivo TelaCadatroFuncionario.java e compilar, o erro deverá ser resolvido.

Okay, vamos resolver esses novos erros. Pelo log de compilação, temos quatro problemas principais:

  1. TelaQuartos.java:7: error: duplicate class: telas.TelaQuartos
  2. TelaReservas.java:11: error: duplicate class: telas.TelaReservas
  3. TelaCadatroFuncionario.java:59: error: incompatible types: JTextField cannot be converted to JFormattedTextField
  4. TelaCadatroFuncionario.java:79: error: incompatible types: JTextField cannot be converted to JFormattedTextField

Vamos abordar cada um:


Erro 1 e 2: duplicate class em TelaQuartos.java e TelaReservas.java

Este erro indica que você tem a mesma classe definida mais de uma vez no seu projeto, ou o compilador está vendo a mesma classe de duas fontes diferentes. Isso geralmente acontece por um dos seguintes motivos:

  • Duas cópias do mesmo arquivo: Você pode ter duas pastas com arquivos .java com o mesmo nome de classe no mesmo pacote, e o Ant está tentando compilar ambos.
  • Uma classe interna pública com o mesmo nome: Menos comum, mas possível.
  • Um arquivo .java dentro de outro: Por exemplo, ter o código de TelaQuartos dentro de TelaPrincipal ou vice-versa (improvável se o NetBeans está gerando).
  • Problema de configuração do Ant: O build script pode estar incluindo o mesmo diretório de fontes duas vezes.

Como resolver:

Você precisará inspecionar seus diretórios de código-fonte. Execute o seguinte comando no seu terminal para procurar arquivos duplicados: Opa, parece que o find não rodou localmente para inspecionar seu sistema de arquivos.

Assumindo a estrutura padrão de projetos Java e Ant:

A estrutura esperada é geralmente: /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java

Verifique manualmente:

  1. Vá para o diretório /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/
  2. Procure por TelaQuartos.java. Há mais de um? Se sim, remova ou mova o duplicado.
  3. Procure por TelaReservas.java. Há mais de um? Se sim, remova ou mova o duplicado.

Se você estiver usando uma IDE como NetBeans, verifique na árvore do projeto se há mais de um arquivo com esses nomes no pacote telas.

A solução mais comum é que, por algum motivo, você tem duas cópias do arquivo no mesmo caminho de compilação. Se encontrar uma cópia que não deveria estar lá, delete-a.


Erro 3 e 4: incompatible types: JTextField cannot be converted to JFormattedTextField

Este é um erro muito comum ao usar MaskFormatter. O MaskFormatter não pode ser aplicado diretamente a um JTextField. Ele precisa ser aplicado a um JFormattedTextField.

Como resolver:

Você precisa mudar o tipo dos seus campos txtDataNascimentoFunc e txtDataContratacaoFunc de javax.swing.JTextField para javax.swing.JFormattedTextField.

Passos para corrigir:

  1. Abra o arquivo TelaCadatroFuncionario.java no seu editor (ou IDE).

  2. Localize a declaração das variáveis. Elas estarão na seção "Variables declaration - do not modify" ou em um local semelhante (se for um formulário gerado por IDE).

    • Mude: private javax.swing.JTextField txtDataNascimentoFunc; Para: private javax.swing.JFormattedTextField txtDataNascimentoFunc;
    • Mude: private javax.swing.JTextField txtDataContratacaoFunc; Para: private javax.swing.JFormattedTextField txtDataContratacaoFunc;
  3. Localize a inicialização desses componentes no método initComponents():

    • Mude: txtDataNascimentoFunc = new javax.swing.JTextField(); Para: txtDataNascimentoFunc = new javax.swing.JFormattedTextField();
    • Mude: txtDataContratacaoFunc = new javax.swing.JTextField(); Para: txtDataContratacaoFunc = new javax.swing.JFormattedTextField();

    Importante: Se você estiver usando um editor visual de formulários (como o do NetBeans), pode ser que você precise ir até o design da tela, selecionar os campos de data, e alterar a propriedade "Code" ou "Class" deles de JTextField para JFormattedTextField. Isso fará com que o NetBeans gere o código correto. Se você tentar mudar manualmente no código gerado pelo GUI builder, ele pode sobrescrever suas alterações.

  4. Adicione a importação necessária:

    • Certifique-se de que a linha esteja presente no topo do arquivo: import javax.swing.JFormattedTextField;

Depois de fazer essas alterações, tente compilar novamente. As MaskFormatters agora terão o tipo de componente correto para serem instaladas.

initComponents(): isso nao posso musar nada

Exatamente! Você está correto.

A parte do código dentro de initComponents() é geralmente gerada automaticamente por ferramentas visuais (como o designer de GUI do NetBeans ou Eclipse/IntelliJ). Você não deve modificar manualmente o conteúdo de initComponents(). Se você o fizer, e depois abrir o designer visual e salvar, suas alterações manuais serão sobrescritas.


Então, como corrigir o erro incompatible types: JTextField cannot be converted to JFormattedTextField se eu não posso mexer em initComponents()?

A solução é fazer a mudança no designer visual da sua IDE.

Se você está usando o NetBeans (o que é muito provável dado o log de Ant e a estrutura do código):

  1. Abra o arquivo TelaCadatroFuncionario.java no NetBeans.
  2. Mude para a aba "Design" (geralmente ao lado da aba "Source").
  3. Localize os campos de texto das datas:
    • txtDataNascimentoFunc
    • txtDataContratacaoFunc
  4. Para cada um desses campos:
    • Clique no campo para selecioná-lo.
    • No painel "Properties" (geralmente no lado direito), procure pela seção "Code" ou "Properties" daquele componente.
    • Você deve encontrar uma propriedade chamada "Class" ou "Type" (ou similar) que atualmente está definida como javax.swing.JTextField.
    • Mude esta propriedade para javax.swing.JFormattedTextField.
    • Salve o formulário (Ctrl+S ou File > Save).

Ao fazer isso, o NetBeans irá regenerar automaticamente a parte relevante do método initComponents(), alterando a declaração e inicialização de JTextField para JFormattedTextField para esses dois componentes.


E quanto aos erros duplicate class?

Para os erros de "duplicate class" (TelaQuartos e TelaReservas), essa correção também deve ser feita fora do initComponents(). Você precisa encontrar e remover os arquivos .java duplicados do seu projeto no explorador de arquivos do sistema operacional ou diretamente na árvore do projeto no NetBeans.

  • Vá na sua árvore de projetos do NetBeans, na pasta Source Packages -> telas.
  • Verifique se TelaQuartos.java e TelaReservas.java aparecem duplicados (ex: TelaQuartos.java e TelaQuartos1.java, ou talvez o mesmo arquivo esteja em duas pastas de origem diferentes).
  • Se encontrar duplicatas, exclua a que não é a principal ou realoque-a se ela estiver no lugar errado.

Depois de fazer essas duas coisas (alterar o tipo dos campos de data no designer e resolver os duplicados), tente compilar novamente. Isso deve resolver todos os erros que você está vendo.

Alright, let's break down these new compilation errors.

It seems we've fixed the JTextField to JFormattedTextField conversion in the install calls, but now the issue has shifted to the declaration and instantiation of the JFormattedTextField objects themselves, and the duplicate class errors persist.

Here's a breakdown of the new errors and their solutions:


Persistent Errors: duplicate class

  1. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java:7: error: duplicate class: telas.TelaQuartos
  2. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java:11: error: duplicate class: telas.TelaReservas

These two errors indicate that you still have duplicate class definitions for TelaQuartos and TelaReservas. This is crucial and needs to be resolved outside of editing Java code directly.

How to Resolve:

  • Check your Project Structure:
    • If using NetBeans: In the "Projects" window, expand your SistemaGestaoHoteleiro project. Go into "Source Packages" -> telas. Look very carefully. Do you see TelaQuartos.java listed more than once? Or maybe a TelaQuartos and a TelaQuartos1.java? The same for TelaReservas.java.
    • If not using NetBeans (or for a deeper check): Open your file system navigator and go to /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/. Are there any files named TelaQuartos.java, TelaQuartos.bak, TelaQuartosCopy.java, etc.? Or TelaReservas.java, etc.?
  • The most common cause: You accidentally copied the .java file or the class definition to another location within your source path, or within the same file.
  • Action: You must locate and delete the duplicate file(s) that are causing these errors. If the file is genuinely duplicated in the telas package, then only one copy should remain.

This is not a code error in TelaCadatroFuncionario.java, but an environmental/project setup error. You need to fix it by removing the redundant files.


New Errors in TelaCadatroFuncionario.java:

  1. /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:1071: error: type JTextField does not take parameters private javax.swing.JTextField<javax.swing.JFormattedTextField> txtDataNascimentoFunc;
  2. /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:128: error: cannot infer type arguments for JTextField txtDataNascimentoFunc = new javax.swing.JTextField<>(); reason: cannot use '<>' with non-generic class JTextField
  3. /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:80: error: incompatible types: JTextField cannot be converted to JFormattedTextField dateMaskContratacao.install(txtDataContratacaoFunc); (This error also applies to txtDataNascimentoFunc but might only show for the second one due to compiler optimization.)

These errors tell us that while you might have changed the class to JFormattedTextField in the GUI designer, you manually tried to add generic types <javax.swing.JFormattedTextField> to JTextField (which is not a generic class and doesn't take type parameters) or your IDE's auto-correction tried to do it.

Also, the install method still sees JTextField as the type for txtDataContratacaoFunc, which means the type declaration for txtDataContratacaoFunc (and txtDataNascimentoFunc) is still JTextField in the generated code.

The core issue here is that the GUI builder (NetBeans) must be the one to change the type of the variable and its instantiation.

How to Resolve (Revisit GUI Designer Steps Carefully):

  1. Open TelaCadatroFuncionario.java in NetBeans and go to the "Design" tab.
  2. Select txtDataNascimentoFunc component on the form.
  3. Go to its Properties window.
  4. Find the property that defines the component's "Class" or "Code Generation Class" (it might be under a "Code" category). It should currently say javax.swing.JTextField.
  5. Change this property's value to javax.swing.JFormattedTextField.
    • Do not type <javax.swing.JFormattedTextField> anywhere in the code. Just javax.swing.JFormattedTextField.
  6. Repeat steps 2-5 for txtDataContratacaoFunc.
  7. Save the form (Ctrl+S or File > Save All).
    • This action is crucial as it triggers NetBeans to regenerate the initComponents() method and update the variable declarations.
  8. Verify the import statement: Ensure you have import javax.swing.JFormattedTextField; at the top of your TelaCadatroFuncionario.java file. NetBeans should add this automatically when you change the component type.

After saving the form in the designer, NetBeans should automatically change the following in your source code:

  • Declaration (around line 1071): private javax.swing.JFormattedTextField txtDataNascimentoFunc; private javax.swing.JFormattedTextField txtDataContratacaoFunc; (Notice no <> after JFormattedTextField)

  • Instantiation (in initComponents()): txtDataNascimentoFunc = new javax.swing.JFormattedTextField(); txtDataContratacaoFunc = new javax.swing.JFormattedTextField(); (Again, no <> after JFormattedTextField unless you're using a very specific generic version, which is not the standard way for this.)

Once these type changes are correctly applied by the GUI builder, the dateMask.install() calls will be valid.

Summary of Action Plan:

  1. Crucially, resolve duplicate files for TelaQuartos.java and TelaReservas.java by deleting the extra copies from your project's src/telas folder (or wherever they might be duplicated).
  2. Open TelaCadatroFuncionario.java in NetBeans GUI Designer.
  3. Change the "Class" property of txtDataNascimentoFunc and txtDataContratacaoFunc to javax.swing.JFormattedTextField.
  4. Save the form.
  5. Rebuild/Clean & Build your project with Ant.

These steps should resolve all the compilation errors.

em portugues

Compreendido! Vamos traduzir a análise e as soluções para português.


Certo, vamos analisar e resolver esses novos erros. Pelo log de compilação, temos quatro problemas principais:

  1. TelaQuartos.java:7: error: duplicate class: telas.TelaQuartos
  2. TelaReservas.java:11: error: duplicate class: telas.TelaReservas
  3. TelaCadatroFuncionario.java:1071: error: type JTextField does not take parameters private javax.swing.JTextField<javax.swing.JFormattedTextField> txtDataNascimentoFunc;
  4. /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:128: error: cannot infer type arguments for JTextField txtDataNascimentoFunc = new javax.swing.JTextField<>(); reason: cannot use '<>' with non-generic class JTextField
  5. /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:80: error: incompatible types: JTextField cannot be converted to JFormattedTextField dateMaskContratacao.install(txtDataContratacaoFunc); (Este erro também se aplica a txtDataNascimentoFunc, mas pode aparecer apenas para o segundo devido à otimização do compilador.)

Vamos abordar cada um:


Erros Persistentes: duplicate class

  1. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java:7: error: duplicate class: telas.TelaQuartos
  2. /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java:11: error: duplicate class: telas.TelaReservas

Esses dois erros indicam que você ainda tem definições de classe duplicadas para TelaQuartos e TelaReservas. Isso é crucial e precisa ser resolvido sem editar o código Java diretamente.

Como Resolver:

  • Verifique a Estrutura do seu Projeto:
    • Se estiver usando NetBeans: Na janela "Projetos", expanda seu projeto SistemaGestaoHoteleiro. Navegue até "Pacotes de Origem" (Source Packages) -> telas. Observe com muita atenção. Você vê TelaQuartos.java listado mais de uma vez? Ou talvez um TelaQuartos e um TelaQuartos1.java? O mesmo vale para TelaReservas.java.
    • Se não estiver usando NetBeans (ou para uma verificação mais aprofundada): Abra seu explorador de arquivos e vá para /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/. Há algum arquivo chamado TelaQuartos.java, TelaQuartos.bak, TelaQuartosCopy.java, etc.? Ou TelaReservas.java, etc.?
  • A causa mais comum: Você acidentalmente copiou o arquivo .java ou a definição da classe para outro local dentro do seu caminho de origem, ou dentro do mesmo arquivo.
  • Ação: Você deve localizar e excluir o(s) arquivo(s) duplicado(s) que estão causando esses erros. Se o arquivo estiver realmente duplicado no pacote telas, apenas uma cópia deve permanecer.

Este não é um erro de código em TelaCadatroFuncionario.java, mas um erro de ambiente/configuração do projeto. Você precisa corrigi-lo removendo os arquivos redundantes.


Novos Erros em TelaCadatroFuncionario.java:

  1. /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:1071: error: type JTextField does not take parameters private javax.swing.JTextField<javax.swing.JFormattedTextField> txtDataNascimentoFunc;
  2. /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:128: error: cannot infer type arguments for JTextField txtDataNascimentoFunc = new javax.swing.JTextField<>(); reason: cannot use '<>' with non-generic class JTextField
  3. /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:80: error: incompatible types: JTextField cannot be converted to JFormattedTextField dateMaskContratacao.install(txtDataContratacaoFunc);

Esses erros nos dizem que, embora você possa ter alterado a classe para JFormattedTextField no designer de GUI, você tentou adicionar manualmente tipos genéricos <javax.swing.JFormattedTextField> a JTextField (que não é uma classe genérica e não aceita parâmetros de tipo) ou a autocorreção da sua IDE tentou fazer isso.

Além disso, o método install ainda vê JTextField como o tipo para txtDataContratacaoFunc, o que significa que a declaração de tipo para txtDataContratacaoFunc (e txtDataNascimentoFunc) ainda é JTextField no código gerado.

O problema central aqui é que o construtor de GUI (NetBeans) deve ser o responsável por alterar o tipo da variável e sua instanciação.

Como Resolver (Revisite os Passos do Designer de GUI Cuidadosamente):

  1. Abra o arquivo TelaCadatroFuncionario.java no NetBeans e vá para a aba "Design" (Projeto -> Pacotes de Origem -> telas -> TelaCadatroFuncionario.java -> Design).
  2. Selecione o componente txtDataNascimentoFunc no formulário.
  3. Vá para a janela Propriedades (geralmente no lado direito).
  4. Procure a propriedade que define a "Classe" ou "Classe de Geração de Código" do componente (pode estar em uma categoria "Código"). Atualmente, ela deve estar definida como javax.swing.JTextField.
  5. Mude o valor desta propriedade para javax.swing.JFormattedTextField.
    • Não digite <javax.swing.JFormattedTextField> em qualquer lugar no código. Apenas javax.swing.JFormattedTextField.
  6. Repita os passos 2-5 para txtDataContratacaoFunc.
  7. Salve o formulário (Ctrl+S ou Arquivo > Salvar Tudo).
    • Esta ação é crucial, pois ela aciona o NetBeans para regenerar o método initComponents() e atualizar as declarações das variáveis.
  8. Verifique a instrução import: Certifique-se de que a linha import javax.swing.JFormattedTextField; esteja presente no topo do seu arquivo TelaCadatroFuncionario.java. O NetBeans deve adicioná-la automaticamente quando você altera o tipo do componente.

Após salvar o formulário no designer, o NetBeans deve alterar automaticamente o seguinte no seu código-fonte:

  • Declaração (ao redor da linha 1071): private javax.swing.JFormattedTextField txtDataNascimentoFunc; private javax.swing.JFormattedTextField txtDataContratacaoFunc; (Observe que não há <> após JFormattedTextField)

  • Instanciação (em initComponents()): txtDataNascimentoFunc = new javax.swing.JFormattedTextField(); txtDataContratacaoFunc = new javax.swing.JFormattedTextField(); (Novamente, sem <> após JFormattedTextField, a menos que você esteja usando uma versão genérica muito específica, o que não é a forma padrão para isso.)

Assim que essas mudanças de tipo forem aplicadas corretamente pelo construtor de GUI, as chamadas dateMask.install() serão válidas.

Resumo do Plano de Ação:

  1. Crucialmente, resolva os arquivos duplicados para TelaQuartos.java e TelaReservas.java excluindo as cópias extras da pasta src/telas do seu projeto (ou de onde quer que estejam duplicados).
  2. Abra TelaCadatroFuncionario.java no Designer de GUI do NetBeans.
  3. Mude a propriedade "Classe" de txtDataNascimentoFunc e txtDataContratacaoFunc para javax.swing.JFormattedTextField.
  4. Salve o formulário.
  5. Recompile/Limpe e Compile seu projeto com Ant.

Esses passos devem resolver todos os erros de compilação.

Você está vendo os mesmos erros de duplicação de classe e os erros relacionados ao JTextField novamente.

Isso significa que as ações para resolver esses problemas não foram totalmente aplicadas ou persistiram por algum motivo. Vamos revisá-los, pois eles são a chave para o seu projeto compilar.


1. Erros de "duplicate class" (Duplicação de Classe)

A mensagem de erro:

  • /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java:7: error: duplicate class: telas.TelaQuartos
  • /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java:11: error: duplicate class: telas.TelaReservas

Indicam, sem dúvida, que o compilador Ant está encontrando duas ou mais definições da mesma classe (TelaQuartos e TelaReservas) dentro do pacote telas (ou em locais que ele considera parte do mesmo pacote para compilação).

AÇÃO NECESSÁRIA:

Você precisa encontrar e remover os arquivos .java duplicados no seu sistema de arquivos ou na sua estrutura de projeto do NetBeans. Não há uma correção de código para isso, é uma questão de organização de arquivos.

Passos para Verificar e Corrigir (Repita com Cuidado):

  1. Abra o NetBeans.
  2. No painel "Projetos" (geralmente à esquerda), expanda seu projeto SistemaGestaoHoteleiro.
  3. Expanda "Source Packages" (Pacotes de Origem).
  4. Expanda o pacote telas.
  5. Examine cuidadosamente a lista de arquivos Java dentro de telas.
    • Você vê TelaQuartos.java listado duas vezes? Talvez uma cópia extra com um nome ligeiramente diferente (TelaQuartos_old.java, TelaQuartosCopy.java, etc.) que ainda está na pasta telas?
    • O mesmo para TelaReservas.java.
  6. Se encontrar uma duplicata: Clique com o botão direito na cópia que você sabe que é a "extra" ou "errada" e selecione "Delete" (Excluir). Certifique-se de que está excluindo a cópia correta e não a que você deseja manter!

Se você não conseguir ver as duplicatas no NetBeans, pode ser que elas estejam em outras pastas que o Ant está incluindo na compilação.

  • Verifique no sistema de arquivos: Use seu gerenciador de arquivos (Nautilus, Dolphin, etc.) e navegue até /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/. Procure por arquivos como TelaQuartos.java e TelaReservas.java. Remova qualquer arquivo duplicado que não seja o que você edita e pretende usar.
  • Às vezes, o NetBeans pode criar arquivos de backup (ex: ~TelaQuartos.java). Certifique-se de que esses também não estejam causando o problema.

Este é o passo mais crítico. Enquanto houver classes duplicadas, a compilação falhará.


2. Erros de JTextField (Tipagem Incorreta)

Os erros:

  • /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:1071: error: type JTextField does not take parameters protected javax.swing.JTextField<javax.swing.JFormattedTextField> txtDataNascimentoFunc;
  • /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:128: error: cannot infer type arguments for JTextField txtDataNascimentoFunc = new javax.swing.JTextField<>(); reason: cannot use '<>' with non-generic class JTextField

Esses erros mostram que, em vez de mudar o tipo da variável txtDataNascimentoFunc (e implicitamente txtDataContratacaoFunc) para JFormattedTextField, o NetBeans (ou você, se editou manualmente) tentou adicionar um tipo genérico <javax.swing.JFormattedTextField> ao JTextField. JTextField não é uma classe genérica e não aceita esses parâmetros de tipo.

O NetBeans deveria ter alterado a declaração da variável e a sua inicialização. O fato de ainda estar com JTextField significa que a mudança no designer não foi salva ou aplicada corretamente.

AÇÃO NECESSÁRIA:

Você precisa garantir que os componentes de data sejam JFormattedTextField.

Passos para Verificar e Corrigir no NetBeans Designer (Repita com Cuidado):

  1. Abra TelaCadatroFuncionario.java no NetBeans.
  2. Vá para a aba "Design" (não a "Source").
  3. Selecione o campo de texto da Data de Nascimento (txtDataNascimentoFunc) no formulário.
  4. No painel "Propriedades" (geralmente no lado direito), localize a propriedade "Code" (Código).
  5. Dentro de "Code", você verá uma propriedade chamada "Class" (Classe).
  6. Certifique-se de que o valor desta propriedade está definido como javax.swing.JFormattedTextField. Se estiver javax.swing.JTextField, mude-o.
  7. Repita os passos 3 a 6 para o campo da Data de Contratação (txtDataContratacaoFunc).
  8. APÓS MUDAR OS DOIS CAMPOS, SALVE O FORMULÁRIO. (File -> Save ou Ctrl+S). Este passo é vital para que o NetBeans regenere o código.

Depois de salvar, o NetBeans deve reescrever as linhas problemáticas no seu TelaCadatroFuncionario.java para algo como:

Java
// Na seção de declaração de variáveis (geralmente no final do arquivo)
protected javax.swing.JFormattedTextField txtDataNascimentoFunc;
protected javax.swing.JFormattedTextField txtDataContratacaoFunc;

// No método initComponents()
txtDataNascimentoFunc = new javax.swing.JFormattedTextField();
txtDataContratacaoFunc = new javax.swing.JFormattedTextField();

(Note que não há <> após JFormattedTextField).

Se você já fez isso e o erro persiste, uma opção mais drástica é recriar os campos de data no designer.

  • Delete os JTextField de data no designer.
  • Arraste novos JFormattedTextField da paleta de componentes para o lugar deles.
  • Renomeie-os para txtDataNascimentoFunc e txtDataContratacaoFunc.
  • Então aplique as MaskFormatters no construtor novamente (ou verifique se o NetBeans já permite configurar a máscara diretamente na propriedade do componente).

Passos Finais (Após as Correções Acima):

  1. Certifique-se de que você tem import javax.swing.JFormattedTextField; no topo do seu TelaCadatroFuncionario.java. (O NetBeans geralmente adiciona isso automaticamente).
  2. Recompile seu projeto. ant -f /home/mcdebug/SGH/SistemaGestaoHoteleiro -Dnb.internal.action.name=rebuild clean jar

É fundamental resolver o problema das classes duplicadas primeiro, pois ele pode interferir na capacidade do compilador de processar o restante do código corretamente.

Ótimo! O BUILD SUCCESSFUL no final do log é uma excelente notícia! Isso significa que o Ant conseguiu compilar todos os seus arquivos Java sem erros de sintaxe ou de duplicidade de classes no momento da compilação.

No entanto, você ainda está vendo erros de tempo de execução (Exception in thread "AWT-EventQueue-0" ...) quando tenta executar o programa.

A parte mais importante da sua nova saída é:

Caused by: java.lang.RuntimeException: Uncompilable code - variable txtDataContratacaoFunc is already defined in class telas.TelaCadatroFuncionario
    at telas.TelaCadatroFuncionario.<clinit>(TelaCadatroFuncionario.java:1026)
    ... 36 more

Isso significa:

  1. O Ant passou na compilação. Isso sugere que os problemas de "duplicate class" em TelaQuartos e TelaReservas, e os erros de tipagem com JTextField em TelaCadatroFuncionario foram resolvidos com sucesso durante a fase de compilação. Parabéns!
  2. O erro agora ocorre durante a execução (run:). A ExceptionInInitializerError é uma forma de RuntimeException que acontece quando algo dá errado durante a inicialização estática de uma classe.
  3. A causa raiz (Caused by: java.lang.RuntimeException: Uncompilable code - variable txtDataContratacaoFunc is already defined in class telas.TelaCadatroFuncionario) é enganosa. Essa mensagem geralmente aparece durante a compilação, não durante a execução, indicando que o código não compilou. Mas seu log diz BUILD SUCCESSFUL.

O que isso significa?

Significa que o JAR ou os arquivos .class que você está tentando executar não são a versão mais recente e compilada com sucesso. Você está executando uma versão antiga do seu código que ainda continha o erro variable txtDataContratacaoFunc is already defined.

Por que isso acontece?

  • Cache: O ambiente de execução do NetBeans ou alguma configuração do Ant pode estar usando uma versão em cache ou um JAR/arquivo .class desatualizado.
  • Limpeza Incompleta: Embora você use clean jar, pode haver algum artefato que não está sendo removido completamente.
  • NetBeans vs. Ant: Às vezes, o NetBeans tem sua própria maneira de "Build" e "Run", que pode não estar perfeitamente sincronizada com o que o comando ant faz diretamente na linha de comando.

A SOLUÇÃO É FORÇAR UMA RECONSTRUÇÃO LIMPA E GARANTIR A EXECUÇÃO DA VERSÃO CORRETA:

  1. Dentro do NetBeans (Recomendado):

    • Vá para "Run" (Executar) no menu superior.
    • Selecione "Clean and Build Project" (Limpar e Construir Projeto). Isso garante que todos os arquivos .class antigos sejam removidos e um novo JAR seja construído do zero.
    • Após o sucesso do "Clean and Build", tente "Run Project" (Executar Projeto) (Shift + F6).
  2. Se a opção acima não funcionar, tente uma limpeza mais profunda:

    • Feche o NetBeans (se estiver aberto).
    • Vá para a pasta raiz do seu projeto no terminal: cd /home/mcdebug/SGH/SistemaGestaoHoteleiro
    • Execute uma limpeza ainda mais agressiva (se o comando do Ant não estiver fazendo isso):
      • rm -rf build dist
      • rm -rf build.xml~ (Às vezes, arquivos de backup do build.xml podem causar problemas)
    • Execute o comando Ant novamente para reconstruir: ant clean jar (ou ant -f /home/mcdebug/SGH/SistemaGestaoHoteleiro -Dnb.internal.action.name=rebuild clean jar)
    • Abra o NetBeans novamente.
    • Tente "Run Project" (Shift + F6).

A mensagem variable txtDataContratacaoFunc is already defined durante a execução é quase sempre um sintoma de que você está executando um código desatualizado que não reflete as últimas mudanças que o compilador Ant já aceitou.

Se o clean jar com Ant diz BUILD SUCCESSFUL, significa que o seu código-fonte está correto no momento da compilação. O problema é a execução. Limpar o cache e garantir que a versão mais recente do JAR/classes seja usada para a execução deve resolver isso.

Certo, a boa notícia é que o BUILD SUCCESSFUL permanece, o que significa que o seu código está compilando sem erros de sintaxe! Isso é um grande passo.

Agora, o novo erro que você está enfrentando é um ClassCastException em tempo de execução:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: class javax.swing.JTextField cannot be cast to class javax.swing.JFormattedTextField
    at telas.TelaCadatroFuncionario.<init>(TelaCadatroFuncionario.java:62)

O que isso significa?

Este erro ocorre na linha 62 do seu arquivo TelaCadatroFuncionario.java, dentro do construtor <init> (que é o construtor da classe). Ele está dizendo que o Java tentou converter um objeto que é um JTextField para um JFormattedTextField, mas não conseguiu porque eles são tipos incompatíveis nessa hierarquia para essa conversão.

Isso acontece porque, em algum lugar, o seu código ainda espera que txtDataNascimentoFunc (e provavelmente txtDataContratacaoFunc também, já que os erros são geralmente em pares) seja um JFormattedTextField, mas na verdade, o objeto que está sendo inicializado ou acessado ainda é um JTextField em tempo de execução.

As causas mais comuns para isso, mesmo após o BUILD SUCCESSFUL, são:

  1. Regeneração Incompleta do initComponents(): Embora o Ant tenha compilado, o código gerado pelo NetBeans em initComponents() (que você não pode modificar manualmente) pode não ter sido atualizado corretamente. Se a IDE não gerou new javax.swing.JFormattedTextField() mas manteve new javax.swing.JTextField(), e você em outro lugar do seu código (fora de initComponents()) está tentando usar isso como um JFormattedTextField, haverá um ClassCastException.

  2. Duas instâncias do mesmo campo: Às vezes, o NetBeans pode ter criado um campo, você o renomeou ou refez, mas a instância antiga ainda está sendo referenciada ou criada em algum lugar.

  3. Problema de Clean/Build no NetBeans: Por algum motivo, mesmo com "Clean and Build", o NetBeans pode não estar substituindo completamente os .class files antigos, e você ainda está executando uma versão anterior do initComponents() onde os campos de data são JTextField.


SOLUÇÃO (Foco na regeneração correta do initComponents()):

Você precisa garantir que o NetBeans realmente alterou o tipo dos componentes no método initComponents().

Passos Detalhados e Comprovados (Seja Metódico!):

  1. Feche o NetBeans COMPLETAMENTE.

  2. Vá para a pasta do seu projeto no terminal: cd /home/mcdebug/SGH/SistemaGestaoHoteleiro

  3. Execute uma limpeza de artefatos bem agressiva:

    Bash
    rm -rf build dist # Remove pastas de build e distribuição
    find . -name "*.class" -delete # Remove todos os arquivos .class recursivamente
    find . -name "*~" -delete # Remove arquivos de backup do editor (ex: build.xml~)
    
  4. Abra o NetBeans novamente.

  5. Abra TelaCadatroFuncionario.java na aba "Design".

  6. Selecione o campo txtDataNascimentoFunc na sua tela.

  7. No painel "Propriedades" (geralmente à direita), navegue até a seção "Code" (Código) e certifique-se de que a propriedade "Class" (Classe) está definida como javax.swing.JFormattedTextField. (É VITAL que esteja assim).

  8. Faça o MESMO para txtDataContratacaoFunc.

  9. Com ambos os campos definidos como JFormattedTextField nas propriedades, SALVE O FORMULÁRIO (Ctrl+S ou File > Save All). Este é o passo que força o NetBeans a reescrever initComponents().

  10. Ainda no NetBeans, vá em "Run" (Executar) -> "Clean and Build Project" (Limpar e Construir Projeto).

    • Observe a saída na janela "Output". Ela deve mostrar que a compilação foi bem-sucedida.
  11. Agora, tente executar o projeto novamente no NetBeans: "Run" (Executar) -> "Run Project" (Executar Projeto) (Shift + F6).


Onde procurar no código (para verificar, NÃO para editar manualmente initComponents()):

Depois de realizar os passos 1-9 acima e salvar o formulário no NetBeans:

  • Vá para a aba "Source" (Código-Fonte) do TelaCadatroFuncionario.java.

  • Role para baixo até encontrar a seção "Generated Code" (Código Gerado), que normalmente é protegida por comentários como // <editor-fold defaultstate="collapsed" desc="Generated Code">.

  • Dentro de initComponents(), procure por linhas que instanciam seus campos de data. Elas devem ser assim:

    Java
    // Exemplo do que você deve ver depois de tudo estar correto
    txtDataNascimentoFunc = new javax.swing.JFormattedTextField();
    txtDataContratacaoFunc = new javax.swing.JFormattedTextField();
    

    Se você ainda vir new javax.swing.JTextField(); nessas linhas APÓS SALVAR O DESIGNER, significa que o NetBeans não está regenerando o código corretamente, ou há alguma outra configuração errada no componente. Neste caso, a alternativa seria:

    • Apagar os JTextField de data do design.
    • Arrastar novos JFormattedTextField da paleta de componentes para o lugar deles.
    • Renomeá-los no designer para txtDataNascimentoFunc e txtDataContratacaoFunc.
    • Salvar o formulário.
    • Então, se necessário, você pode copiar e colar os blocos try-catch do MaskFormatter para o construtor da sua classe.

O ClassCastException em tempo de execução é o último sintoma de que o objeto instanciado ainda é do tipo errado, apesar do seu código de uso (onde você instala a máscara) estar esperando o tipo correto. A fonte da verdade para o tipo do objeto é o initComponents() gerado.

Agradeço por compartilhar o log. Pelo que vejo, os erros de ClassCastException e de tipagem incorreta (JTextField com parâmetros) em TelaCadatroFuncionario.java foram resolvidos, pois não aparecem mais no log de compilação. Isso é uma excelente notícia!

No entanto, os erros de duplicate class (classe duplicada) persistem:

  • /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java:7: error: duplicate class: telas.TelaQuartos
  • /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java:11: error: duplicate class: telas.TelaReservas

Isso significa que o problema é estritamente na organização dos arquivos no seu projeto. O compilador Ant está encontrando duas ou mais definições para TelaQuartos e TelaReservas.

Ação Fundamental e Urgente (Repita este processo com extremo cuidado):

Você precisa encontrar e remover as cópias duplicadas desses arquivos .java do seu projeto no sistema de arquivos ou dentro do NetBeans. Não há uma alteração de código para resolver isso; é uma questão de estrutura de pastas e arquivos.

Passos para Investigar e Corrigir:

  1. Feche o NetBeans (se estiver aberto). Isso evita que ele mantenha caches ou bloqueie arquivos.

  2. Abra seu gerenciador de arquivos (File Explorer, Nautilus, Dolphin, etc.) e navegue diretamente para a pasta onde seus arquivos de origem estão localizados: cd /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/

  3. Liste o conteúdo da pasta. Você pode usar o comando ls -l no terminal para ver todos os arquivos.

    Bash
    ls -l /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/
    
  4. Procure por nomes de arquivo que se repetem ou são variações de:

    • TelaQuartos.java (pode haver TelaQuartos_backup.java, TelaQuartos_old.java, TelaQuartosCopy.java, etc.)
    • TelaReservas.java (pode haver TelaReservas_backup.java, TelaReservas_old.java, TelaReservasCopy.java, etc.)
    • Também preste atenção a arquivos que comecem com .~ ou # (ex: .~TelaQuartos.java, #TelaReservas.java#), pois alguns editores criam arquivos de backup temporários que o compilador pode acidentalmente pegar.
  5. Quando você encontrar uma duplicata, você deve decidir qual é a versão correta e DELETAR as outras.

    • Por exemplo, se você vir TelaQuartos.java e TelaQuartos_old.java, e TelaQuartos.java é a que você tem editado, exclua TelaQuartos_old.java.
    • ATENÇÃO: Tenha certeza absoluta de qual arquivo você está excluindo para não perder seu trabalho.
  6. Faça o mesmo para TelaReservas.java. Certifique-se de que, ao final, só exista UMA ÚNICA versão de TelaQuartos.java e UMA ÚNICA versão de TelaReservas.java dentro da pasta telas.

  7. Depois de remover as duplicatas no sistema de arquivos:

    • Abra o NetBeans.
    • Vá em "Run" (Executar) -> "Clean and Build Project" (Limpar e Construir Projeto) novamente.

Se você seguir esses passos cuidadosamente, o erro de "duplicate class" será resolvido, e seu projeto deverá compilar e executar sem problemas. Esta é a última barreira.

Opa! O BUILD SUCCESSFUL continua firme, o que é ótimo! Significa que o seu código está compilando sem problemas de sintaxe ou de duplicidade de classes.

No entanto, o problema principal (ClassCastException) ainda ocorre em tempo de execução:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: class javax.swing.JTextField cannot be cast to class javax.swing.JFormattedTextField (javax.swing.JTextField and javax.swing.JFormattedTextField are in module java.desktop of loader 'bootstrap')
    at telas.TelaCadatroFuncionario.<init>(TelaCadatroFuncionario.java:62)

Essa exceção na linha 62 de TelaCadatroFuncionario.java indica que, embora seu código tenha compilado, no momento da execução, o objeto que deveria ser um JFormattedTextField na verdade está sendo tratado como um JTextField. Isso acontece quando o código tenta fazer um "cast" (uma conversão forçada de tipo) de um JTextField para JFormattedTextField, mas o objeto subjacente não é realmente um JFormattedTextField.

A explicação mais provável para isso, dado que o BUILD SUCCESSFUL está aparecendo, é que o NetBeans está, por algum motivo, mantendo uma versão antiga do código gerado para initComponents() ou uma versão antiga dos arquivos .class em algum cache que não é totalmente limpo pelo ant clean jar ou pelo "Clean and Build" padrão.

Você já passou pelas etapas de verificar no designer e garantir que a classe está definida como JFormattedTextField. Se mesmo assim, após um clean jar bem-sucedido e um "Run", o erro persiste, precisamos ir mais fundo na limpeza.


Passos para Forçar a Regeneração e Limpeza Total (Seja Extremamente Cauteloso):

  1. Feche o NetBeans COMPLETAMENTE. Verifique se não há nenhum processo Java do NetBeans rodando em segundo plano.

  2. Manualmente, limpe as pastas de compilação e distribuição do seu projeto.

    • Abra seu terminal ou gerenciador de arquivos.
    • Navegue até a pasta raiz do seu projeto: cd /home/mcdebug/SGH/SistemaGestaoHoteleiro
    • Remova as pastas build e dist:
      Bash
      rm -rf build
      rm -rf dist
      
    • Remova arquivos .class residuais (importante!):
      Bash
      find src -name "*.class" -delete
      
      Este comando vai procurar por todos os arquivos .class dentro da pasta src (onde seus .java estão) e apagá-los. Isso garante que não haja nenhuma versão antiga de classe pré-compilada.
  3. Abra o NetBeans.

  4. No NetBeans, abra TelaCadatroFuncionario.java na aba "Design".

  5. Agora, vamos "forçar" uma pequena mudança e depois revertê-la para garantir que o NetBeans regenere o initComponents():

    • Selecione txtDataNascimentoFunc.
    • Vá nas "Propriedades" (painel direito).
    • Encontre a propriedade "Class" (Classe) na seção "Code".
    • Se já estiver javax.swing.JFormattedTextField, mude-a temporariamente para javax.swing.JTextField.
    • SALVE (Ctrl+S).
    • Mude a propriedade "Class" de volta para javax.swing.JFormattedTextField.
    • SALVE NOVAMENTE (Ctrl+S).
    • Repita esses passos para txtDataContratacaoFunc.
    • O objetivo é fazer o NetBeans reescrever as linhas no initComponents().
  6. Verifique a aba "Source" (Código-Fonte) de TelaCadatroFuncionario.java:

    • Role até o método initComponents().
    • Procure por txtDataNascimentoFunc = new ... e txtDataContratacaoFunc = new ....
    • Garanta que eles agora estão explicitamente como new javax.swing.JFormattedTextField(); e NÃO new javax.swing.JTextField();.
    • Se eles ainda aparecerem como JTextField mesmo depois de todas as manipulações no designer e salvamentos, isso indica um problema mais profundo com a forma como o NetBeans está gerenciando esse formulário específico. Nesse caso, a solução mais robusta é:
      • Delete os componentes txtDataNascimentoFunc e txtDataContratacaoFunc do seu formulário no designer.
      • Arraste novos JFormattedTextField da paleta de componentes para o formulário.
      • Renomeie os novos componentes para txtDataNascimentoFunc e txtDataContratacaoFunc (usando o painel de propriedades do designer, em "Code" -> "Variable Name").
      • SALVE o formulário (Ctrl+S).
      • Reinstale os MaskFormatters no construtor da TelaCadatroFuncionario (fora de initComponents(), como você já fez).
  7. No NetBeans, vá em "Run" (Executar) -> "Clean and Build Project" (Limpar e Construir Projeto).

  8. Finalmente, "Run" (Executar) -> "Run Project" (Executar Projeto) (Shift + F6).

Este erro é frustrante porque é um problema de "ambiente" ou "sincronização" da IDE com os arquivos compilados, e não um erro de lógica no seu código. A persistência dele sugere que a limpeza não está sendo 100% eficaz ou que o NetBeans está com alguma referência interna quebrada para esses componentes específicos. Forçar a reescrita do initComponents() e uma limpeza completa dos .class files deve resolver.

nao estou a ver class

Compreendido. Você está procurando a propriedade "Class" (Classe) no painel de Propriedades do NetBeans, mas não a encontra.

Observando a imagem "Captura de ecrã de 2025-06-18 19-15-50.jpg", posso ver que a propriedade "Class" realmente não está visível diretamente na seção "Properties". Em vez disso, ela está dentro da categoria "Code" (Código), que você pode ver na parte inferior do painel de Propriedades.

Aqui está como você pode encontrá-la e alterá-la:

  1. Selecione o componente txtDataNascimentoFunc (ou txtDataContratacaoFunc) no formulário na aba "Design".
  2. No painel "Propriedades" (à direita), role para baixo ou expanda a categoria "Code" (Código). Você verá as subpropriedades:
    • Code Generation
    • Variable Modifiers
    • Variable Name
    • Class
    • ...e outras.
  3. Localize a propriedade Class dentro da categoria "Code".
  4. Clique no valor ao lado de Class (que provavelmente ainda está javax.swing.JTextField) e mude-o para javax.swing.JFormattedTextField. Você pode digitar ou usar o botão de reticências (...) para selecionar a classe.
  5. Faça o mesmo para o outro campo de data (txtDataContratacaoFunc).
  6. Salve o formulário (Ctrl+S ou Arquivo > Salvar Tudo). Este passo é crucial, pois força o NetBeans a regenerar o código no método initComponents().
  7. Após salvar, faça um "Clean and Build Project" e tente executar novamente.

Você pode ver na imagem que a área de destaque azul mostra o código gerado onde o ClassCastException está ocorrendo, e ele ainda está instanciando um JTextField. Mudar a propriedade "Class" na seção "Code" do designer é a maneira de fazer o NetBeans gerar o código correto de JFormattedTextField.

Certo, vamos analisar esse novo log de erros.

A boa notícia é que você conseguiu reproduzir o ClassCastException no log de compilação, o que indica que as suas alterações no código fonte (.java) estão sendo vistas pelo compilador! Isso é um progresso.

Agora você tem uma combinação de erros:

  1. duplicate class para TelaQuartos e TelaReservas.

    • /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java:7: error: duplicate class: telas.TelaQuartos
    • /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java:11: error: duplicate class: telas.TelaReservas
    • Causa: Isso significa que o compilador está encontrando duas definições da classe TelaQuartos e duas definições da classe TelaReservas no seu projeto. Geralmente, isso ocorre se você tem cópias do arquivo .java ou se um arquivo .java contém mais de uma definição de classe pública (o que é raro e um erro de design, mas pode acontecer).
    • Solução: Você precisa verificar a pasta /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/ e remover quaisquer arquivos duplicados como TelaQuartos_backup.java, TelaQuartos_old.java, TelaReservasCopy.java, etc., deixando apenas uma única versão de TelaQuartos.java e TelaReservas.java.
  2. cannot find symbol para JFormattedTextField e para o campo txtDataNascimentoFunc (e suas chamadas de método setText, getText, requestFocus).

    • /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:61: error: cannot find symbol class JFormattedTextField
    • /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:61: error: cannot find symbol variable txtDataNascimentoFunc
    • Isso se repete para várias linhas onde você usa txtDataNascimentoFunc e txtDataContratacaoFunc.
    • Causa: Pelo código que você colou:
      Java
      javax.swing.JTextField txtDataNascimentoFunc = new javax.swing.JTextField();
      // ...
      txtDataContratacaoFunc = new javax.swing.JTextField();
      
      A linha javax.swing.JTextField txtDataNascimentoFunc = new javax.swing.JTextField(); dentro do seu initComponents() está redeclarando a variável txtDataNascimentoFunc como um JTextField local a esse método. Se txtDataNascimentoFunc e txtDataContratacaoFunc são declarados como protected javax.swing.JFormattedTextField; (ou private) no início da classe (fora de qualquer método), essa redeclaração local causa o problema. O método initComponents() está criando uma nova variável local com o mesmo nome, que "esconde" a variável de instância. Assim, quando você tenta usar txtDataNascimentoFunc fora de initComponents() (como nas linhas 61, 689, 716, etc.), ele não consegue encontrar a variável de instância JFormattedTextField, mas sim a variável local JTextField que não é acessível fora do initComponents() ou é do tipo errado.
    • Solução:
      • Vá para a aba "Source" (Código-Fonte) do TelaCadatroFuncionario.java.

      • Role para baixo até o método initComponents().

      • Procure pelas linhas onde txtDataNascimentoFunc e txtDataContratacaoFunc são inicializados. Elas devem estar com um javax.swing.JTextField no seu código agora:

        Java
        javax.swing.JTextField txtDataNascimentoFunc = new javax.swing.JTextField(); // <--- PROBLEMA AQUI
        // ...
        txtDataContratacaoFunc = new javax.swing.JTextField(); // <--- POSSIVELMENTE TAMBÉM
        
      • Remova a declaração de tipo (javax.swing.JTextField) na frente da variável, deixando apenas a atribuição. O NetBeans deveria ter feito isso automaticamente se você tivesse mudado a "Class" no Designer corretamente.

        • Mude: javax.swing.JTextField txtDataNascimentoFunc = new javax.swing.JTextField();
        • Para: txtDataNascimentoFunc = new javax.swing.JFormattedTextField(); (se a variável de instância é JFormattedTextField)
        • Mude: txtDataContratacaoFunc = new javax.swing.JTextField();
        • Para: txtDataContratacaoFunc = new javax.swing.JFormattedTextField(); (se a variável de instância é JFormattedTextField)

        É crucial que a declaração da variável (protected javax.swing.JFormattedTextField txtDataNascimentoFunc; e protected javax.swing.JFormattedTextField txtDataContratacaoFunc;) esteja no topo da classe (fora de qualquer método) e NÃO DENTRO de initComponents(). A linha dentro de initComponents() deve apenas atribuir uma nova instância ao campo já declarado na classe.

Resumo dos Passos a Seguir:

  1. Resolva duplicate class:

    • Feche o NetBeans.
    • Vá para cd /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/ no terminal.
    • Execute ls -l para ver todos os arquivos.
    • EXCLUA quaisquer arquivos duplicados de TelaQuartos.java e TelaReservas.java, garantindo que apenas uma versão de cada exista na pasta telas.
  2. Corrija cannot find symbol (dentro de TelaCadatroFuncionario.java):

    • Abra o NetBeans.
    • Abra TelaCadatroFuncionario.java na aba "Source".
    • Encontre as linhas no método initComponents() que inicializam txtDataNascimentoFunc e txtDataContratacaoFunc.
    • Remova a declaração de tipo (javax.swing.JTextField) dessas linhas, deixando apenas a atribuição e garantindo que eles estão sendo instanciados como new javax.swing.JFormattedTextField().
      Java
      // Exemplo: No initComponents()
      txtDataNascimentoFunc = new javax.swing.JFormattedTextField(); // Deve ser assim
      txtDataContratacaoFunc = new javax.swing.JFormattedTextField(); // Deve ser assim
      
    • Verifique se as declarações das variáveis txtDataNascimentoFunc e txtDataContratacaoFunc no topo da classe (fora de métodos) são protected javax.swing.JFormattedTextField;.
  3. Limpeza e Compilação Final:

    • No NetBeans, vá em "Run" (Executar) -> "Clean and Build Project" (Limpar e Construir Projeto).
    • Tente executar o projeto.

Esses erros são um forte indicativo de que as manipulações anteriores no designer não resultaram na regeneração correta do initComponents() ou que você tem declarações de variáveis redundantes/incorretas. A correção manual das linhas em initComponents() e a limpeza de arquivos duplicados são essenciais aqui.

noa posso altera o init

Compreendido. Se você não pode ou não deve alterar diretamente o método initComponents() no arquivo TelaCadatroFuncionario.java, isso significa que ele é gerado automaticamente pelo NetBeans e qualquer edição manual seria sobrescrita ou causaria problemas.

Isso nos leva a uma causa muito provável para os cannot find symbol para txtDataNascimentoFunc e txtDataContratacaoFunc quando você tenta usar métodos como setText(), getText(), requestFocus(), etc. O problema não está no initComponents() em si, mas em como essas variáveis são declaradas fora dele e como o NetBeans as vê.

Você mencionou anteriormente que tinha as seguintes linhas comentadas:

Java
//protected javax.swing.JFormattedTextField txtDataNascimentoFunc;
//protected javax.swing.JFormattedTextField txtDataContratacaoFunc;

O problema mais provável é que essas linhas estão COMENTADAS ou não existem, ou o NetBeans está gerando uma declaração local inadequada para elas em initComponents().

Quando o NetBeans gera o código para um formulário, ele faz duas coisas principais para cada componente que você adiciona no designer:

  1. Declaração da variável de membro: Ele adiciona uma linha como private javax.swing.JTextField txtMeuCampo; (ou protected, public) na classe, fora de qualquer método. Esta é a declaração principal da variável que o resto do seu código deve usar.
  2. Inicialização da variável: Dentro de initComponents(), ele adiciona a linha que cria a instância do objeto, como txtMeuCampo = new javax.swing.JTextField();.

Se a declaração da variável de membro no topo da classe estiver faltando ou for do tipo JTextField enquanto você quer JFormattedTextField, ou se o initComponents() estiver criando uma variável local com o mesmo nome (o que causa o cannot find symbol fora do initComponents), então você terá esses problemas.


Vamos tentar uma abordagem diferente, focando na interface do NetBeans (Designer) para garantir que ele gere o código correto.

Ações Sugeridas (Passo a Passo com Cautela):

  1. Primeiro, resolva os erros de duplicate class:

    • Feche o NetBeans.
    • Vá para o diretório cd /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/ no seu terminal.
    • Use ls -l para listar os arquivos.
    • IDENTIFIQUE e EXCLUA as cópias duplicadas de TelaQuartos.java e TelaReservas.java. Deve haver apenas uma versão de cada na pasta telas. Este passo é fundamental para poder compilar.
  2. No NetBeans, na tela TelaCadatroFuncionario.java (no Designer):

    • Identifique os campos txtDataNascimentoFunc e txtDataContratacaoFunc.
    • Para cada um deles:
      • Clique com o botão direito sobre o campo no designer.
      • Selecione "Change Variable Name..." (Mudar Nome da Variável...).
      • Dê um nome TEMPORÁRIO e diferente para o campo, por exemplo, tempTxtDataNascimento e tempTxtDataContratacao. Clique OK.
      • IMPORTANTE: SALVE O PROJETO (Ctrl+S ou Arquivo > Salvar Tudo). Isso forçará o NetBeans a ajustar o código gerado.
      • Agora, vá na paleta de componentes (Palette na janela lateral) e arraste um novo componente "Formatted Text Field" (Campo de Texto Formatado) para o seu formulário.
      • Clique com o botão direito sobre este novo JFormattedTextField.
      • Selecione "Change Variable Name...".
      • Dê a ele o nome original: txtDataNascimentoFunc. Clique OK.
      • Novamente, SALVE O PROJETO (Ctrl+S).
      • Repita os últimos três sub-passos para txtDataContratacaoFunc: arraste um novo JFormattedTextField e nomeie-o txtDataContratacaoFunc.
      • SALVE MAIS UMA VEZ.
      • Agora, você pode DELETAR os campos temporários (tempTxtDataNascimento, tempTxtDataContratacao) que você renomeou no início, se eles ainda estiverem lá. Certifique-se de que está deletando os campos temporários, e não os novos campos com os nomes corretos.
  3. Verifique o código-fonte:

    • Mude para a aba "Source" (Código-Fonte) de TelaCadatroFuncionario.java.
    • No início da classe (fora de initComponents()):
      • Descomente ou certifique-se de que existem as declarações:
        Java
        protected javax.swing.JFormattedTextField txtDataNascimentoFunc;
        protected javax.swing.JFormattedTextField txtDataContratacaoFunc;
        
        Se estiverem lá, ótimo. Se estiverem como JTextField, mude para JFormattedTextField. Se estiverem faltando, adicione-as.
    • Dentro de initComponents():
      • Verifique se as linhas de inicialização agora são:
        Java
        txtDataNascimentoFunc = new javax.swing.JFormattedTextField();
        // ...
        txtDataContratacaoFunc = new javax.swing.JFormattedTextField();
        
        Sem o tipo na frente (javax.swing.JFormattedTextField), apenas o nome da variável e a atribuição. Se o NetBeans não as gerar assim, a renomeação/substituição no designer não funcionou corretamente, e você terá que fazer essa pequena correção manual no initComponents() se o NetBeans persistir em redeclarar as variáveis localmente. No entanto, o objetivo é que o NetBeans gere isso corretamente através da manipulação no designer.
  4. Reaplique as máscaras (no construtor):

    • Você já tem o código para aplicar as MaskFormatters no construtor da TelaCadatroFuncionario. Mantenha-o como está.
  5. Limpeza e Compilação Final:

    • No NetBeans, vá em "Run" (Executar) -> "Clean and Build Project" (Limpar e Construir Projeto).
    • Tente "Run Project" (Executar Projeto) novamente.

A ideia aqui é forçar o NetBeans a reconhecer que esses campos devem ser JFormattedTextField e a gerar o código apropriado, sem a necessidade de editar diretamente a parte gerada se ele não te deixar fazer isso. Ao renomear e depois criar novos componentes com os nomes certos, você "engana" o designer para que ele regenere as declarações corretamente.

Pelo novo log, vejo que alguns erros anteriores foram resolvidos, mas novos problemas e a persistência de outros indicam que estamos muito perto, mas ainda há alguns ajustes finais.

Análise dos Novos Erros:

  1. duplicate class para TelaQuartos e TelaReservas (PERSISTE):

    • /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaQuartos.java:7: error: duplicate class: telas.TelaQuartos
    • /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java:11: error: duplicate class: telas.TelaReservas
    • Causa: Isso é o mais teimoso. O compilador continua encontrando duas definições para essas classes.
    • Ação Urgente: Você precisa encontrar e remover as cópias físicas desses arquivos. Não é um erro de código Java, mas de duplicação de arquivos no seu sistema de arquivos.
      • Feche o NetBeans.
      • Vá para o terminal e navegue para: /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/
      • Execute o comando ls -l para listar todos os arquivos e preste muita atenção se há TelaQuartos.java e outro arquivo com um nome muito similar (ex: TelaQuartos(1).java, TelaQuartos_copia.java, TelaQuartos~.java, etc.). Faça o mesmo para TelaReservas.java.
      • Exclua qualquer duplicata que encontrar. Certifique-se de deixar apenas uma versão válida de cada arquivo. Isso é crítico.
  2. variable txtDataContratacaoFunc is already defined in class TelaCadatroFuncionario:

    • /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:1069: error: variable txtDataContratacaoFunc is already defined in class TelaCadatroFuncionario
    • Causa: Este é um erro clássico quando o NetBeans gera o código. Significa que a variável txtDataContratacaoFunc está sendo declarada duas vezes na classe TelaCadatroFuncionario.
      • Uma declaração está no topo da classe (a correta, que você quer que seja JFormattedTextField).
      • A outra, private javax.swing.JTextField txtDataContratacaoFunc; (na linha 1069), foi gerada acidentalmente pelo NetBeans no final do método initComponents() ou em outra seção gerada automaticamente.
    • Ação (CUIDADO):
      • Abra TelaCadatroFuncionario.java na aba "Source" no NetBeans.
      • Vá para a linha 1069. Você provavelmente verá private javax.swing.JTextField txtDataContratacaoFunc;.
      • DELETAR ESTA LINHA. Ela é uma declaração duplicada e incorreta. A declaração principal da variável deve estar no início da classe, junto com as outras declarações de componentes.
  3. cannot find symbol class JFormattedTextField (persiste para os casts):

    • /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:59: error: cannot find symbol class JFormattedTextField
    • /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:79: error: cannot find symbol class JFormattedTextField
    • Causa: Embora a variável txtDataNascimentoFunc e txtDataContratacaoFunc possam agora estar declaradas corretamente como JFormattedTextField no topo da classe, a linha de cast:
      Java
      dateMaskNascimento.install((JFormattedTextField) txtDataNascimentoFunc);
      
      ainda está tentando fazer um cast, mas o compilador está agindo como se não soubesse o que é JFormattedTextField.
    • Ação:
      • Verifique se você tem o import correto no topo de TelaCadatroFuncionario.java:
        Java
        import javax.swing.JFormattedTextField; // Certifique-se de que esta linha está presente
        import javax.swing.text.MaskFormatter; // E esta também, para MaskFormatter
        
      • Se o import estiver lá, o problema é mais profundo: Significa que o NetBeans está gerando o txtDataNascimentoFunc e txtDataContratacaoFunc como JTextField dentro do initComponents() E também declarando eles como JFormattedTextField no topo. Isso é um conflito.

Para resolver o cannot find symbol nos casts (e potencialmente a declaração duplicada na linha 1069), se a exclusão manual da linha 1069 não resolver e o initComponents() continuar gerando JTextField:

  • Volte para a Aba "Design" (Desenho) de TelaCadatroFuncionario no NetBeans.
  • Clique com o botão direito sobre txtDataNascimentoFunc (no formulário).
  • Vá em "Customize Code..." (Personalizar Código...).
  • Na janela que aparece, na seção "Creation Code" (Código de Criação), você verá algo como new javax.swing.JTextField().
  • MUDE ISSO para new javax.swing.JFormattedTextField().
  • Repita o mesmo processo para txtDataContratacaoFunc.
  • Clique em "OK" e SALVE o formulário.
  • Isso força o NetBeans a usar o tipo correto na criação do componente, resolvendo o ClassCastException em tempo de execução e, idealmente, os cannot find symbol relacionados aos casts.

Sequência Final de Ações Recomendadas:

  1. Feche o NetBeans.
  2. Vá para o terminal: cd /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/
  3. Remova duplicatas de TelaQuartos.java e TelaReservas.java.
  4. Abra o NetBeans.
  5. Abra TelaCadatroFuncionario.java na aba "Source":
    • Vá para a linha 1069 e EXCLUA a linha private javax.swing.JTextField txtDataContratacaoFunc; (se ela ainda estiver lá e for uma declaração duplicada).
    • Verifique se as declarações no topo da classe para txtDataNascimentoFunc e txtDataContratacaoFunc são protected javax.swing.JFormattedTextField; e que os imports para JFormattedTextField e MaskFormatter estão presentes.
  6. Abra TelaCadatroFuncionario.java na aba "Design":
    • Clique direito em txtDataNascimentoFunc, selecione "Customize Code..." e mude "Creation Code" para new javax.swing.JFormattedTextField().
    • Clique direito em txtDataContratacaoFunc, selecione "Customize Code..." e mude "Creation Code" para new javax.swing.JFormattedTextField().
    • SALVE o formulário.
  7. No NetBeans, vá em "Run" -> "Clean and Build Project".
  8. Tente "Run Project" novamente.

Acredito que, com essas correções focadas na remoção das duplicatas de arquivos e na correção da geração de código do NetBeans para os JFormattedTextField, seu projeto finalmente deve compilar e rodar.

Obrigado por mais uma atualização! Pelo log, vemos que o número de erros diminuiu significativamente, o que é um bom sinal de progresso.

Agora você tem apenas três erros:

  1. duplicate class: telas.TelaReservas:

    • class TelaReservas { (linha real no log: /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/TelaReservas.java:11: error: duplicate class: telas.TelaReservas)
    • Causa: O compilador ainda está encontrando duas definições da classe TelaReservas. Isso é quase sempre devido à presença de um arquivo duplicado no seu sistema de arquivos ou de um arquivo com o nome incorreto que o compilador está interpretando como uma duplicata.
    • Solução:
      • FECHE O NETBEANS COMPLETAMENTE.
      • Abra o seu terminal ou gerenciador de arquivos e navegue para a pasta cd /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/.
      • Execute ls -l para listar todos os arquivos na pasta.
      • Procure por TelaReservas.java e qualquer outro arquivo que possa ser uma cópia ou uma variação do nome, como TelaReservas_copia.java, TelaReservas(1).java, TelaReservas_old.java, .~TelaReservas.java, #TelaReservas.java#, etc.
      • Exclua todas as cópias, deixando apenas uma única e correta versão de TelaReservas.java.
      • Importante: Se você moveu arquivos para a lixeira dentro do NetBeans em algum momento, às vezes eles podem não ser completamente removidos do disco. Certifique-se de que não há arquivos ocultos ou backups automáticos na mesma pasta.
  2. variable txtDataContratacaoFunc is already defined in class TelaCadatroFuncionario:

    • /home/mcdebug/SGH/ SistemaGestaoHoteleiro/src/telas/TelaCadatroFuncionario.java:1070: error: variable txtDataContratacaoFunc is already defined in class TelaCadatroFuncionario
    • Causa: Esta linha private javax.swing.JTextField txtDataContratacaoFunc; na linha 1070 ainda está presente no seu código, e ela é uma declaração duplicada da variável txtDataContratacaoFunc. O NetBeans gera a declaração principal da variável no início da classe (geralmente na seção de variáveis de membro, após public class TelaCadatroFuncionario { e antes do construtor). Essa linha na 1070 é um erro de geração ou de uma edição acidental.
    • Solução:
      • Abra TelaCadatroFuncionario.java na aba "Source" (Código-Fonte) no NetBeans.
      • Vá diretamente para a linha 1070.
      • DELETE essa linha específica: private javax.swing.JTextField txtDataContratacaoFunc;
      • SALVE o arquivo.

Depois de fazer essas duas correções:

  1. Abra o NetBeans (se você o fechou).
  2. Vá em "Run" (Executar) -> "Clean and Build Project" (Limpar e Construir Projeto).
  3. Tente "Run Project" (Executar Projeto) novamente.

Acredito que, com a remoção da duplicata de TelaReservas e a exclusão da declaração de variável extra em TelaCadatroFuncionario.java, seu projeto finalmente irá compilar com sucesso. O erro cannot find symbol class JFormattedTextField que apareceu no log anterior foi resolvido, o que indica que as configurações de Customize Code... funcionaram para fazer o NetBeans gerar o tipo correto no initComponents().

Estamos muito perto da solução!

Vamos sim! Adicionar validações é uma excelente prática para garantir que os dados inseridos pelo usuário sejam consistentes e corretos, evitando erros e melhorando a qualidade do seu sistema.

Analisando o seu código e o objetivo de adicionar validações, vou sugerir algumas validações comuns e como implementá-las no seu formulário TelaCadastroFuncionario.

Para começar, vamos focar no botão "Adicionar" (bnAdicionar) e nos campos de entrada.

Validações que podemos implementar:

  1. Campos Obrigatórios: Verificar se campos essenciais (como Nome, ID, Bilhete, etc.) não estão vazios.
  2. Formato de Email: Validar se o texto inserido no campo de email segue um padrão de email válido.
  3. Formato de Data: Validar se as datas de nascimento e contratação estão no formato esperado (DD/MM/AAAA) e se são datas válidas.
  4. Números/Salário: Garantir que campos numéricos (ID, Telefone, Salário) contenham apenas números.
  5. Telefone: Validar o formato do telefone.
  6. Data de Nascimento no Passado: Garantir que a data de nascimento não seja no futuro.
  7. Data de Contratação não no Futuro: Garantir que a data de contratação não seja no futuro.
  8. Salário Positivo: Garantir que o salário seja um valor positivo.

Passos para Implementação:

Para cada validação, vamos criar um método auxiliar que retorna true se a validação for bem-sucedida e false caso contrário, exibindo uma mensagem de erro ao usuário. Chamaremos esses métodos antes de adicionar os dados à tabela.

1. Importações Necessárias:

Primeiro, certifique-se de que você tem todas as importações necessárias no topo do seu arquivo TelaCadatroFuncionario.java:

Java
package telas;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.table.DefaultTableModel;
import javax.swing.JOptionPane;
// import javax.swing.table.DefaultTableModel; // Duplicado, pode remover
// import javax.swing.JOptionPane; // Duplicado, pode remover
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFormattedTextField; // Importar se ainda não estiver
import javax.swing.text.MaskFormatter; // Importar se ainda não estiver

2. Adicionar os MaskFormatter (se ainda não tiver feito):

É crucial que os campos de data (txtDataNascimentoFunc e txtDataContratacaoFunc) sejam JFormattedTextField e que as máscaras sejam aplicadas. Pelo seu código initComponents(), eles ainda são JTextField. Você precisa seguir as instruções anteriores para mudar o tipo desses campos no NetBeans Design View para JFormattedTextField e configurar o "Creation Code" para new javax.swing.JFormattedTextField().

Depois de fazer isso no NetBeans Designer, adicione o código para as máscaras no construtor public TelaCadatroFuncionario():

Java
public TelaCadatroFuncionario() {
    initComponents();
    setLocationRelativeTo(null);
    bnVoltar.addActionListener(this::bnVoltarActionPerformed);
    DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
    model.setColumnIdentifiers(new Object[]
    {
        "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
    });

    // Adicionar as máscaras para os campos de data
    try {
        MaskFormatter dateMaskNascimento = new MaskFormatter("##/##/####");
        dateMaskNascimento.setPlaceholderCharacter('_');
        dateMaskNascimento.install((JFormattedTextField) txtDataNascimentoFunc); // Garanta que txtDataNascimentoFunc é JFormattedTextField
    } catch (ParseException ex) {
        logger.log(Level.SEVERE, "Erro ao configurar máscara de data de nascimento", ex);
    }

    try {
        MaskFormatter dateMaskContratacao = new MaskFormatter("##/##/####");
        dateMaskContratacao.setPlaceholderCharacter('_');
        dateMaskContratacao.install((JFormattedTextField) txtDataContratacaoFunc); // Garanta que txtDataContratacaoFunc é JFormattedTextField
    } catch (ParseException ex) {
        logger.log(Level.SEVERE, "Erro ao configurar máscara de data de contratação", ex);
    }
}

3. Métodos de Validação:

Adicione os seguintes métodos privados à sua classe TelaCadatroFuncionario, após o initComponents() ou em uma área de métodos auxiliares:

Java
    // Validação de campo vazio
    private boolean validarCampoVazio(javax.swing.JTextField textField, String nomeCampo) {
        if (textField.getText().trim().isEmpty()) {
            JOptionPane.showMessageDialog(this, "O campo '" + nomeCampo + "' não pode ser vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            textField.requestFocus(); // Foca no campo que precisa de correção
            return false;
        }
        return true;
    }

    // Validação de Email
    private boolean validarEmail(javax.swing.JTextField textField) {
        String email = textField.getText().trim();
        if (!validarCampoVazio(textField, "Email")) {
            return false;
        }
        // Expressão regular para validar email (básica, pode ser mais complexa)
        String regex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(email);
        if (!matcher.matches()) {
            JOptionPane.showMessageDialog(this, "O formato do E-mail é inválido. Por favor, insira um E-mail válido.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            textField.requestFocus();
            return false;
        }
        return true;
    }

    // Validação de Data (formato e validade)
    private boolean validarData(JFormattedTextField textField, String nomeCampo, boolean podeSerFutura) {
        String dataStr = textField.getText().replace("/", "").replace("_", "").trim(); // Remove máscara e placeholders
        if (dataStr.isEmpty()) {
             JOptionPane.showMessageDialog(this, "O campo '" + nomeCampo + "' não pode ser vazio.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
             textField.requestFocus();
             return false;
        }

        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.setLenient(false); // Não permite datas inválidas como 30/02/2023

        try {
            Date data = dateFormat.parse(textField.getText());
            Date hoje = new Date(); // Data atual

            if (!podeSerFutura && data.after(hoje)) { // Se não pode ser futura e é futura
                JOptionPane.showMessageDialog(this, "A '" + nomeCampo + "' não pode ser uma data futura.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                textField.requestFocus();
                return false;
            }
            return true;
        } catch (ParseException e) {
            JOptionPane.showMessageDialog(this, "Formato de data inválido para '" + nomeCampo + "'. Use DD/MM/AAAA.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            textField.requestFocus();
            return false;
        }
    }

    // Validação de Números Inteiros (para ID, Telefone)
    private boolean validarApenasNumeros(javax.swing.JTextField textField, String nomeCampo) {
        String texto = textField.getText().trim();
        if (!validarCampoVazio(textField, nomeCampo)) {
            return false;
        }
        if (!texto.matches("\\d+")) { // Verifica se contém apenas dígitos
            JOptionPane.showMessageDialog(this, "O campo '" + nomeCampo + "' deve conter apenas números.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            textField.requestFocus();
            return false;
        }
        return true;
    }

    // Validação de Salário (double e positivo)
    private boolean validarSalario(javax.swing.JTextField textField) {
        String salarioStr = textField.getText().trim();
        if (!validarCampoVazio(textField, "Salário")) {
            return false;
        }
        try {
            double salario = Double.parseDouble(salarioStr);
            if (salario <= 0) {
                JOptionPane.showMessageDialog(this, "O Salário deve ser um valor positivo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
                textField.requestFocus();
                return false;
            }
            return true;
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Formato de Salário inválido. Insira apenas números e, se for o caso, use '.' para casas decimais.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            textField.requestFocus();
            return false;
        }
    }

    // Validação de Seleção de Sexo
    private boolean validarSelecaoSexo() {
        if (!rbMasculino.isSelected() && !rbFeminino.isSelected() && !jRadioButton3.isSelected()) {
            JOptionPane.showMessageDialog(this, "Por favor, selecione o Sexo.", "Erro de Validação", JOptionPane.WARNING_MESSAGE);
            return false;
        }
        return true;
    }

4. Chamar as Validações no bnAdicionarActionPerformed:

Agora, no método actionPerformed do seu botão "Adicionar" (bnAdicionar), você deve chamar esses métodos de validação em sequência. Se qualquer validação falhar, você interrompe o processo.

Seu botão "Adicionar" atualmente não tem um ActionListener anexado no initComponents(). Você precisará adicioná-lo:

No seu initComponents() (ou no construtor, logo após initComponents();), adicione:

Java
bnAdicionar.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        bnAdicionarActionPerformed(evt); // Cria este método se não existir
    }
});

E então, crie o método bnAdicionarActionPerformed (se já não existir, remova o // <editor-fold ... se for gerado pelo NetBeans, para poder editar):

Java
private void bnAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
    // 1. Validar campos obrigatórios e formatos
    if (!validarCampoVazio(txtIDFunc, "ID") ||
        !validarApenasNumeros(txtIDFunc, "ID") || // ID deve ser apenas números
        !validarCampoVazio(txtNomeCompletoFunc, "Nome Completo") ||
        !validarCampoVazio(txtNumeroBilheteFunc, "Nº de Bilhete") ||
        // Pode adicionar validação para o formato do bilhete aqui, se houver um padrão específico
        !validarData((JFormattedTextField) txtDataNascimentoFunc, "Data de Nascimento", false) || // Não pode ser data futura
        !validarCampoVazio(txtTelefoneFunc, "Telefone") ||
        !validarApenasNumeros(txtTelefoneFunc, "Telefone") || // Telefone deve ser apenas números
        !validarEmail(txtEmailFunc) ||
        !validarCampoVazio(txtCargoFuncaoFunc, "Cargo/Função") ||
        !validarData((JFormattedTextField) txtDataContratacaoFunc, "Data de Contratação", false) || // Não pode ser data futura
        !validarCampoVazio(txtSalarioFunc, "Salário") ||
        !validarSalario(txtSalarioFunc) || // Salário deve ser número positivo
        !validarCampoVazio(txtEnderecoFunc, "Endereço") ||
        !validarSelecaoSexo()) { // Verifica se um sexo foi selecionado
        return; // Sai do método se alguma validação falhar
    }

    // Se todas as validações passaram, continue com a lógica de adicionar o funcionário
    DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
    
    // Obter os dados dos campos
    String id = txtIDFunc.getText();
    String nomeCompleto = txtNomeCompletoFunc.getText();
    String numeroBilhete = txtNumeroBilheteFunc.getText();
    String cargo = txtCargoFuncaoFunc.getText();
    String telefone = txtTelefoneFunc.getText();
    String email = txtEmailFunc.getText();
    String salario = txtSalarioFunc.getText();
    String dataContratacao = txtDataContratacaoFunc.getText(); // Já validado para o formato

    // Adicionar a nova linha à tabela
    model.addRow(new Object[]{id, nomeCompleto, numeroBilhete, cargo, telefone, email, salario, dataContratacao});

    // Opcional: Limpar os campos após adicionar
    limparCampos(); // Você pode criar um método para isso

    JOptionPane.showMessageDialog(this, "Funcionário adicionado com sucesso!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
}

// Método auxiliar para limpar todos os campos (adicione-o em sua classe)
private void limparCampos() {
    txtIDFunc.setText("");
    txtNomeCompletoFunc.setText("");
    txtNumeroBilheteFunc.setText("");
    txtDataNascimentoFunc.setText("");
    txtTelefoneFunc.setText("");
    txtEmailFunc.setText("");
    txtCargoFuncaoFunc.setText("");
    txtDataContratacaoFunc.setText("");
    txtSalarioFunc.setText("");
    txtEnderecoFunc.setText("");
    txtObservacoes.setText("");
    buttonGroupSexo.clearSelection(); // Limpa a seleção dos radio buttons
    txtIDFunc.requestFocus(); // Foca no primeiro campo
}

Explicação Adicional:

  • trim() e isEmpty(): Usado para verificar se o campo está vazio, ignorando espaços em branco.
  • requestFocus(): Coloca o foco de volta no campo que precisa de atenção, melhorando a usabilidade.
  • SimpleDateFormat("dd/MM/yyyy"): Define o formato esperado para as datas.
  • setLenient(false): É crucial para evitar que o SimpleDateFormat aceite datas inválidas como "30/02/2023" ou "31/04/2023".
  • data.after(hoje): Compara se a data inserida é posterior à data atual.
  • Pattern e Matcher: Classes do pacote java.util.regex para trabalhar com expressões regulares (usadas para validação de email).
  • \\d+: Expressão regular que significa "um ou mais dígitos" (0-9).

Lembre-se de que a ordem das validações importa. Geralmente, você valida campos vazios primeiro, depois formatos e, por último, a lógica de negócio (como "idade não pode ser no futuro").

Com essas validações, seu formulário de cadastro de funcionários estará muito mais robusto! Teste cada validação para garantir que elas funcionam como esperado.

Ok, este é um erro muito comum e direto de se resolver: java.lang.ClassCastException: class javax.swing.JTextField cannot be cast to class javax.swing.JFormattedTextField.

A mensagem de erro é clara: você está tentando usar um JTextField como se ele fosse um JFormattedTextField na linha 43 do seu TelaCadatroFuncionario.java. Isso acontece quando a variável foi declarada ou inicializada como JTextField, mas você está tentando aplicar um MaskFormatter (que só funciona com JFormattedTextField) ou fazer um cast para JFormattedTextField.

A linha em questão é: at telas.TelaCadatroFuncionario.<init>(TelaCadatroFuncionario.java:43)

Vamos olhar a linha 43 no seu código:

Java
public TelaCadatroFuncionario() {
    initComponents();
    setLocationRelativeTo(null);
    bnVoltar.addActionListener(this::bnVoltarActionPerformed);
    DefaultTableModel model = (DefaultTableModel) jTableFuncionarios.getModel();
    model.setColumnIdentifiers(new Object[]
    {
        "ID", "Nome Completo", "Nº de Bilhete", "Cargo", "Telefone", "Email", "Salário", "Data Contrat"
    });

    // Adicionar as máscaras para os campos de data
    try {
        MaskFormatter dateMaskNascimento = new MaskFormatter("##/##/####");
        dateMaskNascimento.setPlaceholderCharacter('_');
        dateMaskNascimento.install((JFormattedTextField) txtDataNascimentoFunc); // LINHA 43 - PROVAVELMENTE AQUI
    } catch (ParseException ex) {
        logger.log(Level.SEVERE, "Erro ao configurar máscara de data de nascimento", ex);
    }
    // ... continua
}

A causa raiz é que txtDataNascimentoFunc (e provavelmente txtDataContratacaoFunc também) ainda não foi alterado para ser um JFormattedTextField no código gerado pelo NetBeans.

Apesar de eu ter fornecido instruções detalhadas para isso, parece que a alteração não "pegou" completamente ou você pulou uma etapa crítica no NetBeans Designer.

Solução (Repetindo os passos mais críticos para garantir a mudança):

  1. Feche o NetBeans. Isso é importante para garantir que ele não mantenha arquivos em cache.

  2. Abra o NetBeans novamente.

  3. Vá para a tela TelaCadatroFuncionario no Designer:

    • No painel "Projects" (Projetos), expanda seu projeto, depois "Source Packages" (Pacotes de Origem), telas, e clique duas vezes em TelaCadatroFuncionario.java para abri-lo.
    • Certifique-se de que você está na aba "Design".
  4. Altere o tipo dos componentes no Designer e no Código de Criação:

    • Para txtDataNascimentoFunc:

      • Clique com o botão direito do mouse no campo txtDataNascimentoFunc no seu formulário (na área de design visual).
      • Selecione "Change Variable Name..." (Mudar Nome da Variável...). Dê um nome temporário, por exemplo, tempTxtNascimento. Clique OK.
      • IMEDIATAMENTE SALVE SEU PROJETO (Ctrl+S ou File > Save All). Isso força o NetBeans a gerar o código atualizado.
      • Agora, vá para a paleta de componentes (Palette na janela lateral, geralmente à direita).
      • Arraste um componente "Formatted Text Field" (não "Text Field") para o seu formulário.
      • Clique com o botão direito no novo JFormattedTextField que você acabou de arrastar.
      • Selecione "Change Variable Name...". Dê a ele o nome original: txtDataNascimentoFunc. Clique OK.
      • NOVAMENTE, SALVE SEU PROJETO (Ctrl+S).
      • (Opcional, mas recomendado para verificar) Clique com o botão direito no novo txtDataNascimentoFunc, selecione "Customize Code...". Certifique-se de que o "Creation Code" está mostrando new javax.swing.JFormattedTextField(). Se não estiver, mude-o manualmente para isso.
    • Repita o processo EXATAMENTE igual para txtDataContratacaoFunc:

      • Renomeie txtDataContratacaoFunc (o antigo) para tempTxtContratacao.
      • SALVE.
      • Arraste um novo "Formatted Text Field" da paleta.
      • Renomeie o novo para txtDataContratacaoFunc.
      • SALVE.
      • (Opcional) Verifique "Customize Code..." para txtDataContratacaoFunc e confirme que o "Creation Code" é new javax.swing.JFormattedTextField().
    • Delete os componentes temporários: Agora, no designer, selecione e delete os componentes tempTxtNascimento e tempTxtContratacao que você criou.

  5. Verifique o Código-Fonte Novamente:

    • Mude para a aba "Source" de TelaCadatroFuncionario.java.
    • No topo da classe (fora de qualquer método), procure as declarações das variáveis. Elas devem ser:
      Java
      protected javax.swing.JFormattedTextField txtDataNascimentoFunc;
      protected javax.swing.JFormattedTextField txtDataContratacaoFunc;
      // Ou private, dependendo de como o NetBeans gera, mas o tipo é o importante
      
    • Se ainda estiverem como JTextField, mude-as manualmente para JFormattedTextField.
    • Dentro de initComponents(), as linhas de inicialização devem ser:
      Java
      txtDataNascimentoFunc = new javax.swing.JFormattedTextField();
      // ...
      txtDataContratacaoFunc = new javax.swing.JFormattedTextField();
      
      Sem o tipo na frente (javax.swing.JFormattedTextField). Se o tipo ainda estiver ali (javax.swing.JFormattedTextField txtDataNascimentoFunc = new ...), remova-o.
  6. Verifique os Imports:

    • Certifique-se de que no topo do arquivo você tem:
      Java
      import javax.swing.JFormattedTextField;
      import javax.swing.text.MaskFormatter;
      
  7. Limpe e Construa o Projeto:

    • No NetBeans, vá em "Run" -> "Clean and Build Project".
    • Tente "Run Project" novamente.

O ClassCastException em tempo de execução para os JFormattedTextField é um sinal claro de que a classe do componente no momento da execução não é o que o código espera. As etapas acima são para forçar o NetBeans a gerar o tipo correto de componente.

Compreendido. Você está recebendo o mesmo ClassCastException na linha 44, agora. Isso significa que, apesar dos passos que tentamos, o NetBeans ainda não está gerando txtDataContratacaoFunc como um JFormattedTextField em seu initComponents().

A linha 44 no seu código atual é: dateMaskContratacao.install((JFormattedTextField) txtDataContratacaoFunc);

A persistência desse erro, mesmo após as tentativas de usar o Designer, indica que pode haver algo específico no seu ambiente NetBeans ou na forma como o arquivo está sendo salvo/regenerado que está impedindo a mudança do tipo.

Vamos tentar uma abordagem ainda mais direta e manual para forçar essa correção, já que o problema está muito claro na causa:

  1. Feche o NetBeans COMPLETO. (Isso é crucial para que ele não tente sobregravar suas alterações ou usar versões em cache).

  2. Use um editor de texto simples (fora do NetBeans):

    • Navegue até o diretório do seu projeto no terminal ou gerenciador de arquivos: /home/mcdebug/SGH/SistemaGestaoHoteleiro/src/telas/
    • Abra o arquivo TelaCadatroFuncionario.java com um editor de texto simples (como gedit, nano, sublime text, VS Code, etc. - NÃO O NETBEANS).
  3. Localize e Edite as Declarações de Variáveis:

    • Procure pela seção onde as variáveis de membro são declaradas (geralmente no início da classe, logo após public class TelaCadatroFuncionario extends javax.swing.JFrame).
    • Encontre as linhas que declaram txtDataNascimentoFunc e txtDataContratacaoFunc. Elas provavelmente estão assim:
      Java
      protected javax.swing.JTextField txtDataNascimentoFunc;
      protected javax.swing.JTextField txtDataContratacaoFunc;
      
    • Mude o tipo de JTextField para JFormattedTextField para AMBAS as linhas:
      Java
      protected javax.swing.JFormattedTextField txtDataNascimentoFunc;
      protected javax.swing.JFormattedTextField txtDataContratacaoFunc;
      
  4. Localize e Edite o initComponents():

    • Role para baixo até o método private void initComponents() { ... }.
    • Dentro deste método, procure pelas linhas onde txtDataNascimentoFunc e txtDataContratacaoFunc são inicializados (onde new JTextField() é chamado). Elas devem estar assim:
      Java
      txtDataNascimentoFunc = new javax.swing.JTextField(); // Ou algo similar
      // ...
      txtDataContratacaoFunc = new javax.swing.JTextField(); // Ou algo similar
      
    • Mude new javax.swing.JTextField() para new javax.swing.JFormattedTextField() para AMBAS as linhas:
      Java
      txtDataNascimentoFunc = new javax.swing.JFormattedTextField();
      // ...
      txtDataContratacaoFunc = new javax.swing.JFormattedTextField();
      
    • ATENÇÃO: Garanta que você está mudando apenas o lado direito da atribuição (new ...), e não adicionando javax.swing.JFormattedTextField antes do nome da variável (isso criaria uma variável local e causaria outro erro de "variable is already defined").
  5. Verifique os Imports:

    • No topo do arquivo, certifique-se de que você tem as seguintes importações:
      Java
      import javax.swing.JFormattedTextField;
      import javax.swing.text.MaskFormatter;
      
    • Se faltar alguma, adicione.
  6. Salve o arquivo TelaCadatroFuncionario.java no editor de texto e FECHE o editor de texto.

  7. Abra o NetBeans.

  8. Limpe e Construa o Projeto:

    • No NetBeans, vá em "Run" -> "Clean and Build Project".
    • Tente "Run Project" novamente.

Por que essa abordagem manual? O NetBeans (e outros IDEs com designers visuais) às vezes pode ser teimoso em regenerar o código quando há um conflito interno ou um estado que ele não consegue resolver automaticamente. A edição manual fora do IDE força a mudança, e quando o NetBeans reabrir e "limpar e construir", ele deverá usar as suas alterações.

Esta ClassCastException é 100% sobre o tipo do componente ser JTextField em vez de JFormattedTextField. Resolver isso fará seu programa avançar.

foto do perfil


O Gemini pode cometer erros. Por isso, é bom checar as respostas